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 闭包是(函数作用域的问题)