function judgeOrder(animal){
// debugger;
console.log(animal) // ƒ animal(){
// console.log(animal)
// }
animal = 'pig'
console.log(animal) // pig
function animal(){
console.log(animal)
}
var animal = 'cat'
console.log(animal) // cat
}
judgeOrder('dog')
很显然,可以这里可以看出 var animal = 'cat
这里的animal先声明,然后函数 function animal(){}
的声明覆盖了之前的变量声明。因此第一个打印出了函数。之后就是对animal进行赋值,就打印了pig
,后面也一样打印了cat
。
那么此时,有些同学可能会奇怪传入的参数dog
去哪了。那么此时,我们将 function animal(){}
这个声明注释掉看一下,发现输出如下:
function judgeOrder(animal){
// debugger;
console.log(animal) // dog
animal = 'pig'
console.log(animal) // pig
// function animal(){
// console.log(animal)
// }
var animal = 'cat'
console.log(animal) // cat
}
judgeOrder('dog') // 如果此时未传入实参,那么第一个输出为undefined
此时,显然var animal = 'cat
变量提升,但是没有进行赋值,而我们的函数形参 animal
也有值 dog
,那么就会直接输出dog
了,之后就是对这个animal
进行重新赋值操作。
那么从结论来看,我们可以发现:
优先级: 函数形参 > 变量声明 > 函数声明,
那么相应的值就为最后赋值的变量。
这里还有一个问题就是,将arguments里的的值改变会不会影响到形参的值,将形参的值改变会不会影响到arguments里的值?
写两个简单的例子:
function judgeOrder(animal){
console.log(animal, arguments[0]) // dog dog
animal = 'pig'
console.log(animal, arguments[0]) // pig pig
}
judgeOrder('dog')
function judgeOrder(animal){
console.log(animal, arguments[0]) // dog dog
arguments[0] = 'pig'
console.log(animal, arguments[0]) // pig pig
}
judgeOrder('dog')
我们发现 arguments里对应的值与形参是相对应的,任一其中一个改变,另一个也会随之改变。这就是arguments和形参的映射机制。
但是这里提一点,就是这种模式只会在非严格模式
下存在,如果在严格模式
下(也就是使用了"use strict";
),arguments和形参的影响是单向的
。
"use strict";
function judgeOrder(animal){
console.log(animal, arguments[0]) // dog dog
arguments[0] = 'pig'
console.log(animal, arguments[0]) // dog pig
}
judgeOrder('dog')
以上就是分享的所有内容啦,如果哪里有错,欢迎指出并讨论,谢谢!