js bind 函数 使用闭包保存执行上下文

阅读更多

 

转自:http://www.phphubei.com/article-4254-1.html

js bind 函数 使用闭包保存执行上下文

 

       
       
       
       
JAVASCRIPT CODE
  1.  
  2. window.name = "the window object" 
  3. function scopeTest() { 
  4. return this.name; 
  5. } 
  6. // calling the function in global scope: 
  7. scopeTest() 
  8. // -> "the window object" 
  9. var foo = { 
  10. name: "the foo object!"
  11. otherScopeTest: function() { return this.name } 
  12. }
  13. foo.otherScopeTest();// -> "the foo object!" 
  14. var foo_otherScopeTest = foo.otherScopeTest; 
  15. foo_otherScopeTest(); 
  16. // –> "the window object" 

如果你希望将一个对象的函数赋值给另外一个变量后,这个函数的执行上下文仍然为这个对象,那么就需要用到bind方法。 
bind的实现如下: 
       
       
       
       
JAVASCRIPT CODE
  1.  
  2. // The .bind method from Prototype.js 
  3. Function.prototype.bind = function(){ 
  4. var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift(); 
  5. return function(){ 
  6. return fn.apply(object, 
  7. args.concat(Array.prototype.slice.call(arguments))); 
  8. }
  9. }

使用示例: 
       
       
       
       
JAVASCRIPT CODE
  1.  
  2. var obj = { 
  3. name: 'A nice demo'
  4. fx: function() { 
  5. alert(this.name); 
  6. } 
  7. }
  8. window.name = 'I am such a beautiful window!'
  9. function runFx(f) { 
  10. f(); 
  11. } 
  12. var fx2 = obj.fx.bind(obj); 
  13. runFx(obj.fx); 
  14. runFx(fx2); 

参考: 
http://www.prototypejs.org/api/function/bind 
PS: 
才发现prototypejs的API文档解释的这么详细,一定要花点时间多看看了。 
我的简单的实现: 
       
       
       
       
JAVASCRIPT CODE
  1.  
  2. Function.prototype.bind = function(obj) { 
  3. var _this = this
  4. return function() { 
  5. return _this.apply(obj, 
  6. Array.prototype.slice.call(arguments)); 
  7. } 
  8. } 
  9. var name = 'window'
  10. foo = { 
  11. name:'foo object'
  12. show:function() { 
  13. return this.name; 
  14. } 
  15. }
  16. console.assert(foo.show()=='foo object'
  17. 'expected foo object,actual is '+foo.show()); 
  18. var foo_show = foo.show; 
  19. console.assert(foo_show()=='window'
  20. 'expected is window,actual is '+foo_show()); 
  21. var foo_show_bind = foo.show.bind(foo); 
  22. console.assert(foo_show_bind()=='foo object'
  23. 'expected is foo object,actual is '+foo_show_bind()); 

你可能感兴趣的:(javascript,bind)