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

 

posted on 2022-06-22 11:02  香香鲲  阅读(36)  评论(0编辑  收藏  举报