摘要:硬綁定會大大降低函數的靈活性,使用硬綁定之后就無法使用像隱式綁定或顯示綁定來修改。如果可以給默認綁定指定一個全局對象和意外的值,那就可以實現和硬綁定相同的效果,同時保留隱式綁定或顯示綁定修改的能力。
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 之前,你需要先安裝一個較新的版本的 Java,最好的選擇是,你可以從 www.java.com 獲得官方提供的最新版本的 Java。 安裝JDK sudo yum install java-1.8.0-openjdk.x86_64 ...
閱讀 2304·2023-04-25 14:22
閱讀 3742·2021-11-15 18:12
閱讀 1298·2019-08-30 15:44
閱讀 3220·2019-08-29 15:37
閱讀 651·2019-08-29 13:49
閱讀 3463·2019-08-26 12:11
閱讀 880·2019-08-23 18:28
閱讀 1590·2019-08-23 14:55