JS:笔试题2(函数调用 for 回调函数 同名标识符)
1、要求 :打印 0 1 2
var buttons = [{name: 'b1'}, {name: 'b2'}, {name: 'b3'}]; function bind() { for (var i = 0; i < buttons.length; i++) { buttons[i].onclick = function () { console.log(i); } } }; bind(); buttons[0].onclick(); buttons[1].onclick(); buttons[2].onclick();
打印结果:
3
3
3
理解:
在for循环中的var i,作用域为bind函数内,不在for循环内,如果想要只在for循环内部有效,我们可以使用到let,其作用是在代码块内生效,而var是在作用域内生效,改代码为:
var buttons = [ {name: 'b1'}, {name: 'b2'}, {name: 'b3'} ]; function bind() { for (let i = 0; i < buttons.length; i++) { buttons[i].onclick = function () { console.log(i); } } }; bind(); buttons[0].onclick(); buttons[1].onclick(); buttons[2].onclick();
2、有关回调函数,同名标识符提升问题(https://www.cnblogs.com/LIXI-/p/16394582.html)
var fn1 = 'ivan'; var name = 'good'; var fn1 = function (y) { y(); } function fn1(x) { x(name); } function fn2(x) { console.log(x); //undefined console.log(name); //undefined var name = 'hello'; console.log(name); //hello } fn1(fn2);
打印结果:
undefined
undefined
hello
理解:
首先是变量先提升,所以调用fn1是函数‘var fn1 = function(y){y()};’参数y就是传入的fn2,再调用,此时没有传参,因此第一个打印的x没有定义,因为fn2中有name变量名,但顺序不在打印之前,所以打印name也为定义
3、
var num = 5; function func1() { var num = 3; var age = 4; function func2() { console.log(num); var num = 'ivan'; function func3() { age = 6; } func3(); console.log(num); console.log(age); } func2(); } func1();
打印结果:
undefined
ivan
6
理解:
调用func1,在func1 中调用func2,因为在func2中定义了num,但是打印在定义之前,所以不能访问外层作用域的num值,打印undefined;接着调用func3,其中age = 6改变了全局变量age的值‘4‘为‘6’,因此在func2中调用了func3后,接着打印num为‘ivan’和全局中的age = 6。
4、
var name = 'laruence'; function echo() { console.log(name); } function env() { var name = 'eve'; echo(); } env();
打印结果:
laruence