??在介紹作用域特性之前,我們先來回顧一下js的執(zhí)行上下文(詳細(xì)介紹:https://www.jianshu.com/p/8f19e45fd1f1)
?一段
核心:this要在執(zhí)行時才能確認(rèn)值,定義時無法確認(rèn)。
var a = {
name: 'A',
fn: function (){
console.log(this.name);
}
}
a.fn(); // this === a (即使是b.a.fn(),this也是a)
a.fn.call({name: 'B'}); // this === {name: 'B'}
var fn1 = a.fn;
fn1(); // this === window
this幾種不同的運(yùn)用場景
1、作為構(gòu)造函數(shù)執(zhí)行:(例如:new Foo(),this指向這個新對象)
2、作為對象屬性執(zhí)行:(this指向?qū)ο螅?br/>3、作為普通函數(shù)執(zhí)行:(this指向window)
4、call()、apply()、bind():(this指向傳入的第一個對象參數(shù),bind只有一個參數(shù))
參考:https://www.w3cschool.cn/jsnote/jsnote-this.html
call,apply、bind都屬于Function.prototype的一個方法,他們的作用改變函數(shù)的調(diào)用對象,它是JavaScript引擎內(nèi)在實現(xiàn)的,因為屬于Function.prototype,所以每個Function對象實例(就是每個方法)都有call,apply,bind屬性。既然作為方法的屬性,那它們的使用就當(dāng)然是針對方法的了,這幾個方法是容易混淆的。
call,apply的用法差不多,只是參數(shù)稍微不同;(apply()接收兩個參數(shù),一個是函數(shù)運(yùn)行的作用域(this),另一個是參數(shù)數(shù)組。call()方法第一個參數(shù)與apply()方法相同,但傳遞給函數(shù)的參數(shù)必須列舉出來。)
// 以最簡單window對象為例
function sum(num1, num2) {
return num1 + num2;
}
console.log(sum.call(window, 10, 10)); //20
console.log(sum.apply(window,[10,10])); //20 這兩都相當(dāng)于window.sum(10,10);
// 即語法:foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments)
而bind的用法有一點差別。(只是傳一個參數(shù)對象,然后返回一個函數(shù)給接受的變量,再另外調(diào)用執(zhí)行。)
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
var OSayColor = sayColor.bind(o);
OSayColor(); //blue
詳情:https://www.w3cschool.cn/xqw2e7/9m2x12y0.html
文章題目:作用域和閉包(以及this的用法)
文章源于:http://weahome.cn/article/pogjcc.html