`

javascript中的回调函数中变量作用域

    博客分类:
  • js
阅读更多

1,在callObjMethod方法中,我用了两种方式回调“method"方法: 
第一种方式:method("通过默认上下文回调"); 
没有指定上下文,我们发现回调函数内部访问context的值是全局变量的值, 
这说明,执行该方法的默认上下文是全局上下文。 
第二种方式:method.call(obj,"指定显式对象上下文回调"); 
指定obj为method执行的上下文,就能够访问到对象内部的context

 

[xhtml] view plaincopy
 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
  2. "http://www.w3.org/TR/html4/loose.dtd">  
  3. <html>  
  4. <head>  
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  6. <mce:script type="text/javascript"><!--  
  7. var context="全局";  
  8. var testObj={   
  9.     context:"初始",   
  10.     callback:function (str){   
  11.       //回调函数   
  12.       alert("callback:我所处的上下文中,context="+this.context+",我被回调的方式:"+str);   
  13.     }   
  14. };   
  15. //创建一个对象,作为测试回调函数的上下文   
  16. testObj.context="已设置";   
  17. function testCall(){   
  18.     callMethod(testObj.callback);   
  19.     callObjMethod(testObj,testObj.callback);   
  20. }   
  21. function callMethod(method){   
  22.     method("通过默认上下文回调");   
  23. }   
  24. function callObjMethod(obj,method){   
  25.     method.call(obj,"指定显式对象上下文回调");   
  26. }  
  27. // --></mce:script>   
  28. </head>   
  29. <body> <a href="javascript:void(0)" mce_href="javascript:void(0)" onclick="testCall()">调用测试</a> </body>   
  30. </html>  

 

 

2,在javascript中,在function内部创建一个function的时候,会自动创建一个closure, 

而这个closure就能记住对应的function创建时的上下文

 

[xhtml] view plaincopy
 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
  2. "http://www.w3.org/TR/html4/loose.dtd">  
  3. <html>  
  4. <head>  
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  6. <mce:script type="text/javascript"><!--  
  7. var context="全局";  
  8. var testObj={   
  9.     context:"初始",   
  10.     callback:function (str){   
  11.     //回调函数   
  12.     alert("callback:我所处的上下文中,context="+this.context+",我被回调的方式:"+str);   
  13.     }   
  14. };  
  15. //创建一个对象,作为测试回调函数的上下文   
  16. testObj.context="已设置";  
  17. function testCall(){   
  18.     callMethod(testObj.callback);   
  19.     callWithClosure(function(param){testObj.callback(param);});   
  20.     callObjMethod(testObj,testObj.callback);   
  21. }   
  22. function callMethod(method){ method("通过默认上下文回调"); }   
  23. function callWithClosure(method){ method("通过Closure保持上下文回调"); }   
  24. function callObjMethod(obj,method){ method.call(obj,"指定显式对象上下文回调"); }  
  25. // --></mce:script>   
  26. </head>   
  27. <body> <a href="javascript:void(0)" mce_href="javascript:void(0)" onclick="testCall()">调用测试</a> </body>   
  28. </html>  

 

 

3,在javascript中,this也可以代表当前对象,但不能直接用在匿名function中用,比如: 

JScript code var testObj={ context:"初始", callback:function (str){//回调函数 alert("callback:我所处的上下文中,context="+this.context+",我被回调的方式:"+str); }, caller:function(){ callWithClosure(function(param){this.callback(param);}); } };//创建一个对象,作为测试回调函数的上下文 
以上代码中的this指的不是testObj,而是全局上下文, 需要在closure外写一个临时变量来代表this,完整的代码如下:

 

 

[xhtml] view plaincopy
 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
  2. "http://www.w3.org/TR/html4/loose.dtd">  
  3. <html>  
  4. <head>  
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  6. <mce:script type="text/javascript"><!--  
  7. var context="全局";  
  8. var testObj={   
  9.     context:"初始",   
  10.     callback:function (str){   
  11.         //回调函数   
  12.         alert("callback:我所处的上下文中,context="+this.context+",我被回调的方式:"+str);   
  13.     },   
  14.     caller:function(){   
  15.         callWithClosure(function(param){this.callback(param);});   
  16.         var temp=this;   
  17.         callWithClosure(function(param){temp.callback(param);});   
  18.     }   
  19. };   
  20. //创建一个对象,作为测试回调函数的上下文   
  21. testObj.context="已设置";   
  22. function testCall(){   
  23. //callMethod(testObj.callback);   
  24. testObj.caller();   
  25. //callWithClosure(function(param){testObj.callback(param);});   
  26. //callObjMethod(testObj,testObj.callback);   
  27. }   
  28. function callObjMethod(obj,method){method.call(obj,"指定显式对象上下文回调"); }   
  29. function callMethod(method){ method("通过默认上下文回调"); }   
  30. function callWithClosure(method){ method("通过Closure保持上下文回调"); }   
  31. function callback(str){ alert("callback:我是定义在外部的全局函数。"); }  
  32. // --></mce:script>   
  33. </head>   
  34. <body> <a href="javascript:void(0)" mce_href="javascript:void(0)" onclick="testCall()">调用测试</a> </body>   
  35. </html>  
分享到:
评论

相关推荐

    关于javascript 回调函数中变量作用域的讨论

    关于回调函数中变量作用域的讨论精品推荐,大家可以参考下。

    javaScript函数式编程

    全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的编程、类编程。除此之外,附录中还介绍了更多...

    JavaScript闭包和回调详解

     闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。使用闭包有一个优点,也是它的缺点,就是可以把局部变量驻留在...

    深入浅析JavaScript中的作用域和上下文

    每个函数有不同的变量上下文和作用域。这些概念是javascript中一些强大的设计模式的后盾。然而这也给开发人员带来很大困惑。下面全面揭示了javascript中的上下文和作用域的不同,以及各种设计模式如何使用他们。 上...

    JavaScript核心技术 PDF扫描版

    5.2回调函数 5.3函数和递归 5.4嵌套函数、函数闭包和内存泄漏 5.5作为对象的函数 5.6习题 第6章捕捉事件 6.1O级DOM上的事件句柄 6.22级DOM上的事件句柄 6.3产生事件 6.4习题 第7章表单与即时验证 7.1访问表单 7.2把...

    JavaScript详解(第2版)

     3.2.4 变量作用域   3.2.5 变量的拼接   3.3 常量   3.4 要注意的bug   3.5 应知应会   练习   第4章 对话框   4.1 与用户交互   4.1.1 alert&#40;&#41;方法   4.1.2 prompt()方法  ...

    前端JavaScript笔记整理

    Web API:DOM操作、定时器、事件、回调函数、日期对象、节点操作、移动端事件、Windows对象、本地存储、正则表达式 JavaScript高级:作用域、函数进阶、解构赋值、构造函数、编程思想、原型、深浅拷贝、异常处理、...

    JavaScript语言精粹

    4.9 作用域 4.10 闭包 4.11 回调 4.12 模块 4.13 级联 4.14 套用 4.15 记忆 5:继承 5.1 伪类 5.1 对象说明符 5.2 原型 5.3 函数化 5.4 部件 6:数组 6.1 数组字面量 6.2 长度 6.3 删除 6.4 枚举 ...

    JavaScript语言精粹.pdf

    4.9 作用域 4.10 闭包 4.11 回调 4.12 模块 4.13 级联 4.14 套用 4.15 记忆 第5章 继承 5.1 伪类 5.2 对象说明符 5.3 原型 5.4 函数化 5.5 部件 第6章 数组 6.1 数组字面量 6.2 长度 6.3 删除 6.4 ...

    javascript入门笔记

    Javascript,简称为 JS,是一款能够运行在 JS解释器/引擎 中的脚本语言 JS解释器/引擎 是JS的运行环境: 1、独立安装的JS解释器 - NodeJS 2、嵌入在浏览器中的JS解释器 JS的发展史: 1、1992年 Nombas 开发...

    把JavaScript代码改成ES6语法不完全指南(分享)

    * 预备知识(如何把回调函数改为Promise) * 开始修改 * 修改成箭头函数(Arrow Function) * 预备知识(箭头函数是什么) * 预备知识(箭头函数函数中的this是个坑) * 开始修改 * 修改拼接字符串成模板字符串...

    Java中的闭包与回调

    “闭包”一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。在Scheme、CommonLisp、Smalltalk、Groovy、JavaScript、Ruby和Python...

    guia-estelar-js:the RocketSeat基本JavaScript课程中的练习和笔记

    作用域let和const 命名变量 声明赋值变量 分组语句 串联和内插变量 对象 数组 练习题 职能 参数和参数 在函数内返回值 理解功能的另一种方式 功能范围 功能吊装 箭头功能 回调功能 构造函数 原型 类型转换强制 数字...

    leetcode分类-blog::cookie:我的博客

    leetcode 分类 生活、工作和兴趣 To Do List 前端 ...基本的表单标签 ...JavaScript JavaScript基础知识 ...执行上下文栈和变量对象 ...let可以将变量绑定到所在的任意作用域中(通常是{...}内部) this 浅拷贝(shallow copy)

    《JavaScript语言精粹[修订版]》高清版_2012.09_【蝴蝶书】_172页完整版

    作用域 闭包 回调 模块 级联 柯里化 记忆 第5 章 继承 伪类 对象说明符 原型 函数化 部件 第6 章 数组 数组字面量 长度 删除 枚举 容易混淆的地方 方法 指定初始值 第7 章 正则表达式 一个例子 结构 元素 第8 章 ...

    Node.js MongoDB AngularJSWeb开发中文版.part1

    2.6 理解变量作用域 22 2.7 使用JavaScript对象 22 2.7.1 使用对象语法 23 2.7.2 创建自定义对象 23 2.7.3 使用原型对象模式 24 2.8 处理字符串 25 2.8.1 合并字符串 26 2.8.2 在字符串中搜索子串 26 2.8.3 在一个...

Global site tag (gtag.js) - Google Analytics