1 function test (x, y, z) {
console.log(test.length)
console.log(arguments.length)
console.log(arguments.callee === test)
console.log(arguments[2])
}
test(10,20)
答案:3 2 true undefined
解析:
test.length 是返回的函数的形参个数,所以为 3;
arguments.length 返回的是函数调用时的实参个数,所以为 2;
arguments.callee: 初始值就是正被执行的 Function 对象, 用于在函数内部调用自身,arguments 对象本身是个由函数调用时传入的实参组成的伪数组,访问单个参数的方式与访问数组元素的方式相同。
只传入了两个参数,自然为 undefined.
2 var a = 10
a.pro = 10
console.log(a.pro + a)
var s = ‘hello’
s.pro=’world’
console.log(s.pro+s)
答案:NaN undefinedhello
解析:JavaScript 引擎内部在处理对某个基本类型 a 进行形如 a.pro 的操作时,会在内部临时创建一个对应的包装类型 (对数字类型来说就是 Number 类型) 的临时对象,并把对基本类型的操作代理到对这个临时对象身上,使得对基本类型的属性访问看起来像对象一样。但是在操作完成后,临时对象就销毁了,下次再访问时,会重新建立临时对象,当然就会返回 undefined 了
3 var f =1
if(!f) {
var a =10
}
function fn() {
var b =20
c = 30
}
fn()
console.log(a)
console.log(c)
console.log(b)
答案:undefined 30 报错:b is not defined
解析:1、没有用 var 声明的是全局变量,即便在函数内部;
2、只有在 function 内部新声明的才是局部变量,在 if,while,for 等声明的变量其实是全局变量(除非本身在 function 内部)
3、因为变量提升,虽然 if 块的内容没执行,但是预解析阶段会执行 var a,只是没有赋值而已,因此打印 a 是 undefined 而打印 b 会报错