js this 的绑定和函数作用域

this:

在 JavaScript 中,上下文对象就是 this 指针,即被调用函数所处的环境。上下文对象 的作用是在一个函数内部引用调用它的对象本身。在 JavaScript 中,本质上,函数类型的变量是指向这个函数实体的一个引用,在引用之 间赋值不会对对象产生复制行为。我们可以通过函数的任何一个引用调用这个函数,不同之 处仅仅在于执行时候的上下文,可以通过bind,apply,call等改变this的指向。

function test() {
    var obj = {
        f: function() {
            console.log(this === window)
        }
    }
    return obj;
}

test().f() // 输出 false 因为f 执行时,是obj 的属性

function test() {
    var obj = {
        f: function() {
            console.log(this === window)
        }
    }
    return obj.f;
}

test()() // 输出 true test() 返回一个函数,(其实返回的函数是由一个临时变量应用的,在window作用域)

改变this
var myObj = {
    specialFunction: function () {
    },
    getAsyncData: function (cb) {
        cb();
    },
    render: function () {
        var that = this;
        this.getAsyncData(function () {
            that.specialFunction();
        });
    }
};

myObj.render();

或者render这样写

render: function () {

    this.getAsyncData(function () {

        this.specialFunction();

        this.anotherSpecialFunction();

    }.bind(this));

}

Function.prototype.bind = function (scope) {
    var fn = this;
    return function () {
        return fn.apply(scope);
    };
}
函数作用域

函数作用域的嵌套关系是定义时决定的,而不是调用时决定的,也就 是说,JavaScript 的作用域是静态作用域,又叫词法作用域,这是因为作用域的嵌套关系可 以在语法分析时确定,而不必等到运行时确定

var a=1;
function test(){
    var a=2;
    return function(){
        console.log(a)
    }
}
test()(); // 输出 2  闭包是(函数作用域的问题)

你可能感兴趣的:(js this 的绑定和函数作用域)