国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Hard binding & Soft binding detailed explanati

xiyang / 3462人閱讀

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

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

如果可以給默認綁定指定一個全局對象和undefined意外的值,那就可以實現和“硬綁定”相同的效果,同時保留“隱式綁定”或“顯示綁定”修改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上,但如果應用默認綁定規則,則會將this綁定到oThis。

參考:You Dont Known JS

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/108201.html

相關文章

  • Elasticsearch本地 && docker-compose 安裝

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

    zhangwang 評論0 收藏0

發表評論

0條評論

xiyang

|高級講師

TA的文章

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