javascript中this的指向(着重分析匿名函数的this指向)

1、this的意义(this是什么?):

http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html

this是Javascript语言的一个关键字。

它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。

https://zhuanlan.zhihu.com/p/23804247

this 是你 call 一个函数时传的 context

https://dmitripavlutin.com/gentle-explanation-of-this-in-javascript/

In JavaScript the situation is different: this is the current execution context of a function.

总结一下: this是函数执行时的上下文,当使用this.变量/方式时,该上下文的变量和方法被调用。

2、this的生成与绑定时间:

The this object is bound at runtime based on the context in which a function is executed。

3、this的指向:

In most cases, the value of this is determined by how a function is called. It can‘t be set by assignment during execution, and it may be different each time the function is called.

翻译:在大多数情况下,this的值(指向)是由函数如何被调用决定的。它不能在执行期间被赋值,而且每次调用时它的值都可能不一样。

MDN的文档已经很好地说明了this的各种指向:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

此处不再对各种情况进行说明,而着重对匿名函数的this指向进行分析:

★ 匿名函数的this指向:

JS高级程序设计中文版中有一句话:“匿名函数的执行环境具有全局性,因此其this对象通常指向window。”

然而实际上,英文原版根本没有提到执行环境的全局性问题,

原文是:

Anonymous functions are not bound to an object in this context, meaning the this object points to window unless executing in strict mode (where this is undefined).

翻译:

在这个上下文(执行环境)中匿名函数并没有绑定到任意一个对象中,以为这this指向window(除非这个上下文(执行环境)是在严格模式下执行的,而严格模式下该this指向undefined)

以下是附录的代码,this context指的是下面的代码

var name = “The Window”;

var object = {

name : “My Object”,

getNameFunc : function()

{

return function()

  {

return this.name;

  };

} };

alert(object.getNameFunc()());  //”The Window” (in non-strict mode)

另一个例子分析:

var number = 1;
  var obj =

  {
     number: 2,
     showNumber: function()

  {
      this.number = 3;
      (function(){
      console.log(this.number);//1 立即执行函数并没有绑定在obj对象中,所以指向的是window,输出为1
      })();
      console.log(this.number);//3 showNumber函数在调用时被绑定到了obj中,而函数中的this.number修改了obj的number值,所以输出为3
    }
  };
  obj.showNumber();

总结一下:判断 this 指向谁,看执行时函数被绑定在哪里,只要函数(function)没有绑定在对象上调用,它的 this 就是 window。

4、严格模式下this的指向:

When using the apply() or call() methods of a function, a null or undefined value is coerced to the global object in nonstrict mode.

In strict mode, the this value for a function is always used as speci?ed, regardless of the value.

翻译:在正常模式下,当使用函数的apply()或call()方法时,如果参数为null或者undefined,this指向都会被强制变为全局对象。

而在严格模式下,this的指向完全由它所被放入的上下文决定,即使被指定为null或者是undefined,this的指向都会是该上下文。

1、
"use strict";
var color = "red";
function displayColor(){ alert(this.color); }
displayColor.call(null);
//VM139:3 Uncaught TypeError: Cannot read property ‘color‘ of null
at displayColor (<anonymous>:3:40)
at <anonymous>:4:14

2、
var color = "red";
function displayColor(){ alert(this.color); }
displayColor.call(null);//red

严格模式下,如果this未在执行的上下文中定义,那它将会默认为undefined

1、

"use strict";
var color = "red";
function displayColor(){ alert(this.color); }
displayColor();
//VM119:3 Uncaught TypeError: Cannot read property ‘color‘ of undefined
at displayColor (<anonymous>:3:40)
at <anonymous>:4:1

2、

"use strict";
function displayColor(){ alert(this === window); }//false
displayColor();

3、
var color = "red";
function displayColor(){ alert(this.color); }
displayColor();//red

其他请参考MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

时间: 2024-12-09 20:36:46

javascript中this的指向(着重分析匿名函数的this指向)的相关文章

关于原生js中ie的attacheEvent事件用匿名函数改变this指向后,不能用detachEvent删除绑定事件的解决办法?

博客搬迁,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/11/28/%e5%85%b3%e4%ba%8e%e5%8e%9f%e7%94%9fjs%e4%b8%adie%e7%9a%84attacheevent%e4%ba%8b%e4%bb%b6%e7%94%a8%e5%8c%bf%e5%90%8d%e5%87%bd%e6%95%b0%e6%94%b9%e5%8f%98this%e6%8c%87%e5%90%91%e5%90%8e%e4%b8%8

Javascript中的attribute和property分析

attribute和property这两个单词,都有属性的意思,attribute有属性.特质的意思,property则有性质,性能的意思. 首先需要明确的是,在规范中,读取和设置attribute的方法是getAttribute/setAttribute/removeAttribute,比如box.setAttribute('somekey','somevalue') 而想要访问元素的property,则需要用.(点)的方法,比如,box.somekey,下面先说attribute: <div

JavaScript中两种类型的全局对象/函数(转)

转自:http://www.cnblogs.com/snandy/archive/2011/03/19/1988626.html 这里所说的JavaScript指浏览器环境中的包括宿主环境在内的.第一种是ECMAScript Global Object,第二种是宿主环境(Host)下的全局对象/函数. 一.核心JavaScript内置对象,即ECMAScript实现提供的不依赖于宿主环境的对象 这些对象在程序执行之前就已经(实例化)存在了.ECMAScript称为The Global Objec

在Javascript 中创建JSON对象--例程分析

作者:iamlaosong 要想用程序从网页上抓数据,需要熟悉HTML和JavaScript语言,这里有一个在Javascript 中创建JSON对象的例程,学习并掌握其内容,在此对此例程做个注释,记录我掌握的知识,以备将来验证是否正确. 程序很简单,分三部分: 1.<h2>部分:用大字符显示标题: 2.<p>部分:显示一段信息的结构,但无内容,内容在后面添加: 3.<scrip>部分:Javascript程序,先定义了一个JSON结构的变量JSONObject,然后,

JavaScript中如何判断变量是数组、函数或是对象类型

数组 ECMAScript5中Array.isArray是原生的判断数组的方法,IE9及以上支持.考虑到兼容性,在没有此方法的浏览器中,可以使用 Object.prototype.toString.call(obj) === '[object Array]'替代. var isArray = Array.isArray || function(obj) {     return Object.prototype.toString.call(obj) === '[object Array]'; }

JavaScript中如何判断变量是数组、函数还是对象类型

数组 ECMAScript5中Array.isArray是原生的判断数组的方法,IE9及以上支持.考虑到兼容性,在没有此方法的浏览器中,可以使用Object.prototype.toString.call(obj) === '[object Array]'替代. var isArray = Array.isArray || function(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; } 函数 最

javascript闭包,作用域,自调用匿名函数

一,自调用匿名函数 有两种方式:       第一种: (function(参数){....}(传入参数))    --->括号内的语句被强制执行 第二种: (function(参数){...})(传入参数)     --->说明:jquery就是采用这种方式,这种方式的原理:  原来我们调用函数的方式是,先定义,在进行函数名调用        function funName(){        alert("hello world");        }       

JavaScript中有对字符串编码的三个函数:escape,encodeURI,encodeURIComponent

JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent . 下面简单介绍一下它们的区别 1 escape()函数 定义和用法 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法 escape(string) 参数  描述  string  必需.要被转义或编码的字符串. 返回值 已编码的

JavaScript中两种类型的全局对象/函数

这里所说的JavaScript指浏览器环境中的包括宿主环境在内的. 第一种是ECMAScript Global Object,第二种是宿主环境(Host)下的全局对象/函数. 一.核心JavaScript内置对象,即ECMAScript实现提供的不依赖于宿主环境的对象 这些对象在程序执行之前就已经(实例化)存在了.ECMAScript称为The Global Object,分为以下几种 1, 值属性的全局对象(Value Properties of the Global Object).有NaN