作用域与闭包

来源:互联网 发布:同行业数据查询 编辑:程序博客网 时间:2024/04/29 01:10
执行上下文
    范围:一段<script>或者一个函数
    全局:变量定义、函数声明 (一段<script>)
    函数:变量定义、函数声明、this、arguments (函数)
    PS:注意“函数声明”和“函数表达式”的区别
    console.log(a);
    var a = 100;
    fn('zhangsan');
    function fn(name) {
        age = 20;
        console.log(name, age);
        var age;
    }
this
    this要在执行是才能确认值,定义是无法确认
        var a = {
            name: 'A';
            fn: function () {
                console.log(this.name);
            }
        }
        a.fn();     // this === a
        a.fn.call({name: 'B'});     //this ==== {name: 'B'}
        var fn1 = a.fn;
        fn1();      //this === window
    
    作为构造函数执行
        function Foo(name) {
            this.name = name;
            return this;
        }
        var f = new Foo('zhangsan');


    作为对象属性执行
        var obj = {
            name: 'A';
            printName: function (){
                console.log(this.name);
            }
        }
        obj.printName;


    作为普通函数执行
        function fn() {
            console.log(this);
        }
        fn();


    call apply bind
        function fn1(name, age) {
            alert(name);
            console.log(this);
        }
        fn1.call({x: 100}, 'zhangsan', 20);


作用域
    没有块级作用域
    只有函数和全局作用域
作用域链
闭包
    闭包的使用场景
        函数作为返回值
            function F1() {
                var a = 100;


                //返回一个函数(函数作为返回值)
                return function () {
                    console.log(1);
                }
            }
            //f1得到一个函数
            var f1 = F1();
            var a = 200;
            f1();


        函数作为参数传递
    
原创粉丝点击