`

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()); 
分享到:
评论
1 楼 csniper 2012-08-22  
console.assert(foo_show()=='window',

相关推荐

    javascript笔记之匿名函数和闭包.docx

    在闭包中,`this`的指向取决于调用上下文。在上述的`getUserFunction`示例中,`this`在闭包内指向的是`window`,而不是`obj`,因为闭包不是一个对象的方法。如果想让`this`指向`obj`,可以使用`.call`或`.apply`方法...

    深入理解javascript原型和闭包1

    至此,我们讨论了JavaScript中一些核心的概念,包括对象、函数、原型、继承、执行上下文、作用域和闭包。理解这些概念对于深入掌握JavaScript至关重要。 (17)——补this `this`的绑定策略在JavaScript中比较复杂...

    深入理解JavaScript系列(11) 执行上下文(Execution Contexts)

    在JavaScript中,理解执行上下文对于解决作用域、闭包、`this`指向等问题至关重要。例如,函数调用时的`this`值取决于其执行上下文,全局上下文中`this`通常指向全局对象,在非严格模式下为`window`,在严格模式下为...

    javascript中bind函数的作用实例介绍

    在给出的示例代码中,首先展示了原生JavaScript中bind函数的使用方式: ```javascript var button = document.getElementById("button"); button.onclick = function() { alert(this.id); // 弹出button }.bind...

    JS 函数式编程指南

    箭头函数是ES6引入的新语法,它提供了一种更简洁的函数定义方式,并且没有自己的`this`上下文,更符合函数式编程的语义。 通过理解和应用这些概念,开发者可以在JS项目中充分利用函数式编程的优点,提高代码质量...

    Web-前端教程38 JS进阶:上下文.zip

    在JavaScript中,上下文是一个至关重要的概念,它涉及到函数执行、作用域以及闭包等多个方面。理解上下文对于提升编程能力、避免常见错误以及优化代码性能至关重要。 首先,我们要了解JavaScript中的上下文通常指的...

    javascript基础核心内容

    本文将深入探讨JavaScript的核心内容,包括对象、原型链、构造函数、执行上下文、作用域链、闭包以及this指针等关键概念。 1. **对象**: JavaScript中的对象是一种键值对的集合,可以看作是属性的容器。对象可以...

    js代码-bind函数实现

    JavaScript中的`bind`函数是一个非常重要的特性,它允许我们固定函数的上下文(this值)以及预先设置函数的参数,从而提供了一种控制函数执行环境的强大工具。在JavaScript中,`this`关键字的值取决于函数调用的方式...

    对于Javascript 执行上下文的全面了解

    及`this`的值会被确定。首先,`variableObject`会包含函数的`...通过深入理解执行上下文,开发者可以更好地掌握JavaScript中的作用域规则,避免出现未声明变量的错误,以及更好地利用闭包和作用域链来实现特定的功能。

    javascript中利用柯里化函数实现bind方法

    4. 使用Function.prototype.apply方法来动态改变函数的上下文(context)并执行它,apply方法允许你指定一个对象作为函数运行时的this,并传递一个数组作为参数。 文章中提到的bind方法的实现原理,是通过柯里化来...

    js代码-测试bind函数3

    这个压缩包文件包含了一个名为`main.js`的主要脚本和一个`README.txt`的说明文件,很显然,我们关注的重点是`main.js`,它可能包含了对`bind`函数的使用示例。 `bind`函数主要用途是创建一个新的函数,在新函数中,...

    js代码-测试bind函数2

    在这个名为"js代码-测试bind函数2"的主题中,我们将深入探讨`bind`函数的工作原理、用途以及如何在实际开发中应用它。 一、`bind`函数的基本概念 `bind`函数是函数对象的一个方法,它的语法为`func.bind(thisArg[,...

    js 方法原理解析 apply、bind_js_前端

    接下来,`bind`方法也是用于改变函数调用的上下文,但它返回一个新的函数,而不是立即执行。这意味着你可以预先设置`this`的值,并在未来的任意时间点调用这个新函数。例如: ```javascript function log() { ...

    Javascript函数

    10. **apply和call方法**:这两个方法都可以改变函数调用时的`this`上下文,并允许动态传递参数。`apply`接收一个数组或类数组对象作为参数,而`call`则直接接收参数列表。 以上是对JavaScript函数的深入探讨,理解...

    javascript中利用柯里化函数实现bind方法【推荐】

    // 获取传入bind函数的参数 return _this.apply(context, args.concat(bindArgs)); // 执行原函数并返回结果 }; }; ``` 在上述代码中,mybind方法会首先检测当前函数是否可以被调用。它接着截取所有除了上下文...

    javascript函数详解!

    ES6引入了箭头函数,其语法更简洁,且不绑定自己的`this`,而是继承自父级上下文。 ```javascript var add = (a, b) => a + b; ``` 8. **函数参数的rest运算符` rest运算符(`...`)允许你在函数中接受不定...

    js代码-测试bind函数

    在这个名为"js代码-测试bind函数"的压缩包中,我们有两个文件:`main.js`和`README.txt`。`main.js`很可能是实现或演示`bind`功能的代码,而`README.txt`可能包含了关于代码的简要说明或使用指南。 `bind`函数的...

    JS中this上下文对象使用方式

    在JavaScript中,还可以使用call、apply和bind方法来控制函数调用的上下文,即显式地设置函数内this的值。这些方法接受一个或多个参数,并允许我们调用函数时改变其内部的this指向。例如,obj.sayName().call(obj)会...

Global site tag (gtag.js) - Google Analytics