最近看《JavaScript高级程序设计》一书,在讲到函数中对象一节时,提到了this对象,中有一句“this是函数在执行时所处的作用域”,译者注:原书的提法并不准确,详见http://www.cn-cuckoo.com/2010/05/08/about-one-sentence-of-pro-js-2nd-1626.html。于是我就看了,但下面有几个人评论说原书是正确的,还给出了一些代码,对结果不是很懂。

几经迷茫才理清思路,现整理如下。

1、函数必须被对象所调用,若直接使用一个已经定义的函数,则它是被全局对象Global调用;

2、函数被调用时,直接引用变量的,遵循变量的函数域查找法则,由这个变量定义的最近函数域开始,依次向外层函数域查找同名变量,直到全局域,也即全局对象;

3、函数被调用时,若通过this调用,则会通过对象的原型链查找;因为this就是直接引用到了调用该函数的对象。

根据上面这三个法则,就不会判错了。下面贴上代码:【Download】

// Test for basic function scope
var value = 'global scope';
function getValue() {var value = 'function scope';function _getValue() {return value;}return _getValue();
}
function getThisValue() {var value = 'function scope';function _getValue() {return this.value;}return _getValue();
}
alert(getValue());                  // function scope /* called by window */
alert(getThisValue());              // global scope /* called by window */// Test for prototype chain with property
function Base(){this.value = 'base scope';this.getValue = function() {return value;};this.getThisValue = function() {return this.value;}
};
var objBase = new Base();
alert(objBase.getValue());          // global scope /* this.value has value 'base scope', bug it is a property but not a varable. */
alert(objBase.getThisValue());      // base scope
var objChild = new Base();
alert(objChild.getValue());         // global scope
alert(objChild.getThisValue());     // base scope /* lookup through property chain. */
objChild.value = 'child scope';
alert(objChild.getValue());         // global scope
alert(objChild.getThisValue());     // child scope// Test for prototype chain with variable in function
function Base2(){var value = 'base function scope';this.getValue = function() {return value;};this.getThisValue = function() {return this.value;}
};
var objBase = new Base2();
alert(objBase.getValue());          // base function scope
alert(objBase.getThisValue());      // undefined /* objBase called getThisValue, but has no property named value. */
var objChild = new Base2();
alert(objChild.getValue());         // base function scope
alert(objChild.getThisValue());     // undefined
objChild.value = 'child scope';
alert(objChild.getValue());         // base function scope
alert(objChild.getThisValue());     // child scope

转载于:https://www.cnblogs.com/wanghan/archive/2012/09/20/2694576.html

JavaScript 中一句话的思索:this是函数在执行时所处的作用域相关推荐

  1. JavaScript中的钩子(钩子机制\钩子函数\hook)是什么?

    我的博客https://www.ideaopen.cn/ 首先,看到我们的标题: JavaScript中的钩子(钩子机制\钩子函数\hook) 是什么? 我们前端的JavaScript中,经常提到钩子 ...

  2. JavaScript 中的 Hoisting (变量提升和函数声明提升)

    如何将 函数声明 / 变量 "移动" 到作用域的顶部. 术语 Hoisting(提升) 在很多 JavaScript 博文中被用来解释标识符的解析.其实 Hoisting(提升) ...

  3. C++中怎么样可以做到让一个函数最后执行

    下面代码中,怎么才能保证让lastExecute最后执行(在所有析构函数执行完后再执行lastExecute).非常感谢. C/C++ code ? 1 2 3 4 5 6 7 8 9 10 11 1 ...

  4. JavaScript中的组合(Compose)函数

    组合(Compose)函数 组合(Compose)函数是在JavaScript开发过程中一种对函数的使用技巧.模式: 比如我们现在需要对某一个数据进行函数的调用,执行两个函数fn1和fn2,这两个函数 ...

  5. js Javascript中调用对象内函数.(字符串函数名)

    对象['methodName'](args): window.οnlοad=function(){ //函数名字符串 var methodsName='plus'var x = cal[methods ...

  6. 在JavaScript中每5秒调用一个函数

    setInterval(function (){ alert("Hello"); }, 5000);

  7. electron中showMessageBox里关于选择按钮回调函数不执行的错误

    一般程序在用户点击窗口右上角关闭按钮时会弹出一个对话框,用来询问用户是否退出程序,用户点击取消或者关闭对话框不会关闭程序,点击确定则会退出程序.在写electron应用时也希望添加这个功能,代码如下: ...

  8. JavaScript中的面向对象--对象创建

    JavaScript高级程序设计第3版总结p156 1.JavaScript中的对象 首先,ECMAScript 中函数实际上是对象.每个函数都是 Function 类型的实例,而且都与其他引用类型一 ...

  9. JavaScript中函数作为另一个函数的参数的时候它存在于哪个作用域

    一直对函数作为参数被传递进另外一个函数理解的不是很清除.先看下这段代码吧: function test(fn){var bar = 1;fn(); } var bar = 99; test(funct ...

最新文章

  1. 吴恩达机器学习笔记-梯度下降
  2. OpenResty 概要及原理科普
  3. 娓娓道来Promise
  4. 【玩转cocos2d-x之九】动作类CCAction
  5. maven 导入数据库
  6. 使用JavaScript实现页面选项自动添加行以及删除行 javaweb
  7. C++ char[] 与 string 转换
  8. C#中利用Linq.Dynamic实现简单的动态表达式构建查询
  9. FreeRTOS互斥锁
  10. 中国女性补体面膜市场趋势报告、技术动态创新及市场预测
  11. container of()函数简介
  12. .NET C#获取当前网页地址信息
  13. python 中的坦克大战0.1版本
  14. Mac系统如何删除.DS_Store文件且不再生
  15. Spring的Bean生命周期
  16. C语言(静态链接库和动态链接库)
  17. 计算机开机速度慢是什么原因,电脑开机慢是什么原因?怎么处理?
  18. spark封神之路(1)-spark简介
  19. HTML/JSP中一些单书名号标签的用途
  20. python迭代法求极值_用Python实现最速下降法求极值的方法

热门文章

  1. 将集合中的内容按时间排序
  2. Callable与Future的简单介绍
  3. 【poj3208-Apocalypse Someday】数位DP
  4. 记于2014-12-9
  5. 在struts-config.xml中配置validator-plugin导致404 Servlet action is not available
  6. Microsoft Enterprise Library 4.0 for Visual Studio 2008
  7. Android开发之LisitView的图文并排效果实现(源代码分享)
  8. 如何设计秒杀服务器的限流策略
  9. 一個简单的okhttp访问网络的例子
  10. Android View measure(0,0)的作用