最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript中this關(guān)鍵字的一些小知識

 更新時間:2015年03月15日 10:12:29   投稿:junjie  
這篇文章主要介紹了Javascript中this關(guān)鍵字的一些小知識,本文講解了this的隱性綁定、var that = this兩部份內(nèi)容,需要的朋友可以參考下

Javascript應(yīng)該是現(xiàn)在最流行的跨平臺語言之一,一直在玩前端的一些有意思的東西,發(fā)現(xiàn)竟然沒有掌握好這門語言。有點(diǎn)舍本逐末,于是想趁著現(xiàn)在這有空的時候好好補(bǔ)充一點(diǎn)遺漏的東西。

this的隱性綁定

一開始這是我很迷惑的東西,剛開始看到的時候,不理解。而后,在相似的情況下,又能用類似的方法解決同樣的問題。便試著理清這其中的知識,方便于查找。

這是一個Javascript語言上設(shè)計的錯誤,但是似乎這個錯誤是不可避免的,函數(shù)是對象,數(shù)組是對象等等。引用《Javascript: The Good Parts》中的例子

復(fù)制代碼 代碼如下:

function add (a,b) {return a+b}
 var sum = add (3,4);
 console.log(sum); //sum = 7

此時sum的結(jié)果是7。

復(fù)制代碼 代碼如下:

 > typeof add
 > 'number'

在這里可以看到,add的類型是數(shù)值。

以此模式調(diào)用函數(shù)時,this被綁定到全局變量。
也就是在現(xiàn)在的環(huán)境下,我們可以這樣調(diào)用this

復(fù)制代碼 代碼如下:

 this.add(3,4)

這就是this的隱性綁定,而this會以不同的方式被綁定。
復(fù)制代碼 代碼如下:

var hello = function (){
    return "Hello, " + this.name;
};
name = 'this';
console.log(hello());

這時我們就會得到Hello,this。而當(dāng)
復(fù)制代碼 代碼如下:

var hello = function (){
    return "Hello, " + this.name;
};
var user = {
    hello : hello,
    name : 'phodal',

};
console.log(user.hello());


這時user中的hello便指向了hello函數(shù),而這在我們的理解中,這怎么可能,所以是個Bug。

如果我們在這個方法中定義一個變量并給它賦值this,那么內(nèi)部函數(shù)就可以通過那個變量訪問到this。

var that = this

于是當(dāng)情況稍微復(fù)雜一點(diǎn)的時候我們就需要用到:

復(fù)制代碼 代碼如下:

 vat that = this;

tips:

1.this變量的作用域總是由其最近的封閉函數(shù)所確定。
2.使用一個局部變量(如me,self,that)讓this綁定對于內(nèi)部是可用的。

一個簡單的例子:

復(fù)制代碼 代碼如下:

var M = function(){
    this.name = "M";
};

var MM = function(){
    z = new M();
    this.name = "MM";

    z.printName = function(){
        console.log(this.name);
    };
    return z.printName();
};

var mm = new MM;


這時的this指向的是M函數(shù),而由MM自身。如果我們將M中的this去掉,那么返回的就是一個undefined。 于是我們就創(chuàng)建一個當(dāng)前this作用域的別名,如that或者self等等:
復(fù)制代碼 代碼如下:

var MM = function(){
    z = new M();
    this.name = "MM";
    var self = this;
    z.printName = function(){
        console.log(self.name);
    };
    return z.printName();
};

這樣就能返回一個MM了。除此之外,在ES5中可以用回調(diào)函數(shù)的bind方法。

復(fù)制代碼 代碼如下:

var MM = function(){
    z = new M();
    this.name = "MM";
    z.printName = function(){
        console.log(this.name);
    }.bind(this);
    return z.printName();
};

bind可以將方法綁定到接收者。

其他

又一個hello,world

在一次偶然的機(jī)會中遇到print('Hello')('World'),然后輸出了'Hello, World'。

所謂的高階函數(shù),看上去似乎很有用,有興趣可以看看下一篇

相關(guān)文章

最新評論

西平县| 天水市| 灌南县| 吉林市| 宁河县| 张掖市| 衢州市| 广元市| 鄂托克旗| 巢湖市| 延川县| 昌黎县| 敖汉旗| 平武县| 礼泉县| 区。| 运城市| 金华市| 镇平县| 炎陵县| 澜沧| 班玛县| 乌拉特前旗| 杨浦区| 东安县| 泉州市| 泊头市| 清苑县| 灌阳县| 托克托县| 神木县| 普格县| 朝阳县| 安岳县| 淳安县| 彩票| 平武县| 宜兴市| 游戏| 罗江县| 新和县|