javascript scope的研究

简介:

 首先有个原则:

就是在Javascript中,对于scope的处理,如果是被对象调用的函数,比如o.f() 的形式,那么this 指针指向“点”前面的对象,比如这里的o.

如果是普通函数,也就是没有“点”号,那么对于浏览器来说,这个this指针指向的是window.

附上测试源代码:

 

 
 
  1. var theAccumulator={ 
  2.                                  
  3.          total:0, 
  4.          clear:function(){ 
  5.                  this.total=0 ; 
  6.                }, 
  7.          add:function(x){ 
  8.                 this.total+=x; 
  9.              }, 
  10.          getResult:function(){ 
  11.               return this.total; 
  12.              } 
  13.                                  
  14. function printResult(f){ 
  15.      alert("result=" + f()); 
  16.                                  
  17. theAccumulator.clear();  
  18. theAccumulator.add(100); 
  19. theAccumulator.add(200);           
  20. printResult(theAccumulator.getResult);   

在这种情况下,为什么是undefined呢?

因为printResult(theAccumulator.getResult) 传递进去的是一个类似C里面函数指针的方式,这个方式是可取的(没有任何语法毛病,我一开始以为是有语法毛病的),因为

 

 
 
  1. theAccumulator.getResult  

是代表以下函数体


 
 
  1.   
  2.  
  3. function(){ 
  4.  
  5. return this.total; 
  6.  
  7.  } 
  8.  
  9.   
  10.  
  11.   

所以原始写法就等效于printResult(


 
 
  1. function(){ 
  2.  
  3. return this.total; 
  4.  
  5.   } 
  6.  
  7. );  
  8.  
  9.   

这里看出,括号内部匿名方法(也就是function(){})没有被任何对象所调用。所以它是“普通方法”,所以他的函数体里面的this指向的是window,而window 这个scope上并没有一个叫total的成员(因为total成员是theAccumulator的,而不是window的),所以会出现undefined


基于这个思路,我做了进一步的测试。于是,我在保留JSON对象不变和全局函数不变的情况下做了一个很小的测试,结果验证是完全正确的

 

我的改动是:


 
 
  1. printResult(function(){return theAccumulator.getResult();}); 

其他不变

 

我的想法是,现在这个getResult,由于是以“点”的方式调用了,所以this指针应该会指向点前面的scope,也就是theAccumulator对象,而theAccumulator对象(实实在在的确一定当然)会有getResult()方法,所以,他能解析到。

 

经过测试,果然OK 。




本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/840221,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
JavaScript 前端开发
JavaScript基础知识-作用域(action scope)
关于JavaScript基础知识中作用域的介绍。
46 1
JavaScript基础知识-作用域(action scope)
|
7月前
|
JavaScript Java 测试技术
Java项目基于ssm+vue.js的科研经费管理系统研究附带文章和源代码设计说明文档ppt
Java项目基于ssm+vue.js的科研经费管理系统研究附带文章和源代码设计说明文档ppt
34 0
|
7月前
|
JavaScript 前端开发
js开发:请解释什么是作用域(scope),并说明全局作用域、局部作用域和块级作用域的区别。
JavaScript中的作用域规定了变量和函数的可见性与生命周期。全局作用域适用于整个脚本,变量可通过全局对象访问,可能导致命名冲突和内存占用。局部作用域限于函数内部,每次调用创建新作用域,执行完毕后销毁。ES6引入的块级作用域通过`let`和`const`实现,变量仅在其代码块内有效,并有暂时性死区。作用域机制有助于代码组织和变量管理。
57 1
|
JavaScript 前端开发 开发者
|
JavaScript API 开发者
为依赖Angular.js的上古项目给VSCode编写$scope定义跳转扩展插件
虽然Angular.js停止更新已经一年了,但依赖它的上古时代的项目并不少。由于都是使用js开发,很难为其提供很好的维护,所以直到今天开发维护也并不愉快。可以说没有开发插件的支持,再成熟老练的框架都发挥困难。
176 0
为依赖Angular.js的上古项目给VSCode编写$scope定义跳转扩展插件
|
JavaScript 数据库
js动态添加datagrid表头&批量保存实战研究
最近小编在做项目的时候,遇到了这样一个需求:如下图所示,表头中的"一般"和"优秀"是动态添加的,添加上对应的票数之后,选中多行,单击保存,将动态添加的列数据转换成行保存到数据库中
|
JavaScript 前端开发
(译)看得见的 JavaScript: 作用域(链)Scope (Chain)
(译)看得见的 JavaScript: 作用域(链)Scope (Chain)
91 0
|
设计模式 自然语言处理 JavaScript
带你走进JS作用域(Scope)的世界
概念介绍 最少访问原则 JS中的作用域 全局作用域 局部作用域 块级声明 上下文(Context) 执行上下文(Execution Context) 词法作用域(Lexical Scope) 闭包 公共作用域和私有作用域 通过.call(), .apply() and .bind()修改上下文
|
前端开发 JavaScript
Javascript AST 编译器的研究学习
# Javascript AST 编译器的研究学习 ## Source: ```javascript 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _IceInteractContainer = require('./InteractContaine
3204 0