成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Hard binding & Soft binding detailed explanati

xiyang / 3468人閱讀

摘要:硬綁定會大大降低函數(shù)的靈活性,使用硬綁定之后就無法使用像隱式綁定或顯示綁定來修改。如果可以給默認(rèn)綁定指定一個全局對象和意外的值,那就可以實現(xiàn)和硬綁定相同的效果,同時保留隱式綁定或顯示綁定修改的能力。

JavaScript中硬綁定與軟綁定詳解
JS中硬綁定這種方式可以把this強制綁定到指定的對象(除了使用new時),防止函數(shù)調(diào)用時應(yīng)用默認(rèn)綁定規(guī)則(非嚴(yán)格模式下全局對象-window
| global,嚴(yán)格模式下undefined)。硬綁定會大大降低函數(shù)的靈活性,使用硬綁定之后就無法使用像“隱式綁定”或“顯示綁定”來修改this。

如果可以給默認(rèn)綁定指定一個全局對象和undefined意外的值,那就可以實現(xiàn)和“硬綁定”相同的效果,同時保留“隱式綁定”或“顯示綁定”修改this的能力。

// hard binding
if(!Function.prototype._hardBind) {
    Function.prototype._hardBind = function(oThis) {
        if(typeof this !== "function") {
            throw new TypeError("Function.prototype.softBind - what is trying to be bound is not callable.");
        }
        var aArgs = [].slice.call(arguments, 1);
        var fToBind = this;
        var fNOP = function() {};
        var fToBound = function() {
            return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat([].slice.call(arguments)));
        };
        if(this.prototype) {
            fNOP.prototype = this.prototype;
        }
        fToBond.prototype = new fNOP();
        return fToBond;
    };
}


// test code
function foo() {
    console.log("name: " + this.name);
}

var obj1 = {name: "obj1"};
var obj2 = {name: "obj2"};
var obj3 = {name: "obj3"};

var _foo = foo._hardBind(obj1);
_foo(); // "name: obj1"

obj2.foo = foo._hardBind(obj1);
obj2.foo(); // "name: obj1"

_foo.call(obj3); // "name: "obj1"

setTimeout(obj2.foo, 100); // "name: obj1"

// soft binding
if(!Function.prototype._softBind) {
    Function.prototype._softBind = function(oThis) {
        if(typeof this !== "function") {
            throw new TypeError("Function.prototype.softBind - what is trying to be bound is not callable.");
        }
        var aArgs = [].slice.call(arguments, 1);
        var fToBind = this;
        var fToBound = function() {
            return fToBind.apply((!this || (this === (window || global))) ? oThis : this, aArgs.concat([].slice.call(arguments)));
        };
        fToBound.prototype = Object.create(fToBind.prototype);
        return fToBound;
    };
}


// test code

function foo() {
    console.log("name: " + this.name);
}

var obj1 = {name: "obj1"};
var obj2 = {name: "obj2"};
var obj3 = {name: "obj3"};

var _foo = foo._softBind(obj1);
_foo(); // "name: obj1"

obj2.foo = foo._softBind(obj1);
obj2.foo(); // "name: obj2"

_foo.call(obj3); // "name: obj3"

setTimeout(obj2.foo, 100); // "name: obj1" 

可以看到,軟綁定版本的foo()可以手動將this綁定到obj2或者obj3上,但如果應(yīng)用默認(rèn)綁定規(guī)則,則會將this綁定到oThis。

參考:You Dont Known JS

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108201.html

相關(guān)文章

  • Elasticsearch本地 && docker-compose 安裝

    摘要:安裝前的檢查安裝之前,你需要先安裝一個較新的版本的,最好的選擇是,你可以從獲得官方提供的最新版本的。 安裝前的檢查 安裝 Elasticsearch 之前,你需要先安裝一個較新的版本的 Java,最好的選擇是,你可以從 www.java.com 獲得官方提供的最新版本的 Java。 安裝JDK sudo yum install java-1.8.0-openjdk.x86_64 ...

    zhangwang 評論0 收藏0

發(fā)表評論

0條評論

xiyang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<