js函数的new调用与普通调用中this的差异问题
place='out'; function where(){ var place='in'; alert(place); //in alert(this.place); //out } where();
从中可以得知,place获得了函数内部的变量,而this.place则获得了外部的变量值。这是为什么呢?其实,this的作用是指向执行当前函数的外部环境对象。在这里执行where时的环境是全局环境,所以this指向global(在浏览器中是window),那么 this.place 得到的就是全局变量 place 了。
通过下面一段代码进行验证。
place='out'; passer={ var place: 'in', askWhere: function(){ alert(this.place); //in }, }; passer.askWhere();
这里的this在askWhere指向的函数中,函数执行的外部环境是passer对象,所以 this 指向 passer 对象,this.place 得到的也就是 in 。
那么再看下面一段代码,new 会导致函数中的 this 出现哪些不同呢?
function Passer(){ this.place = 'in'; this.askWhere = function(){ alert( this.place ); //in } } alert(window.place); //undefined Tom = new Passer(); Tom.askWhere();
如果按照之前的理论分析,Passer 中的 this 指向 global ,那么this.place 应该是在全局环境中定义了place,为什么会出现window.place = undefined 的情况呢?
这里就体现出new 调用与普通调用的区别了。其实 new 操作时进行了一下几个步骤:
1.创建一个新的对象(并把空对象的__proto__属性设置为Passer.prototype)。 2.将构造函数的作用域赋给新对象(此时this 指向了这个新对象)。 3.执行构造函数中的代码(通过this 为这个新对象添加属性) 4.返回新对象。
因此这里的this 实际上并没有指向全局,而是一个新的对象。那么执行askWhere 时函数内的this 也是指向这个新的对象内部的。
如果这里的构造函数Passer 进行普通调用,结果和我们最开始的分析是相符的。
总结:在对函数进行new 调用时this 的表现的根本原因在于创建了一个新的对象并将构造函数的作用域赋给新对象,这使得this 指向了新对象。其实this 指向执行当前函数的外部环境对象的作用是一直没变的。
以上就是js函数的new调用与普通调用中this的差异问题的详细内容,更多请关注其它相关文章!
上一篇: html转txt文件怎么实现? html转txt的方法详解!
下一篇: Python中的魔法描述符
推荐阅读
-
JS与OC交互,JS中调用OC方法(获取JSContext的方式)
-
js函数定义的三种方式(js函数定义与调用)
-
JavaScript中的子窗口与父窗口的互相调用问题
-
JS中‘hello’与new String(‘hello’)引出的问题详解
-
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
-
More Effective C++----(12)理解"抛出一个异常"与"传递一个参数"或"调用一个虚函数"间的差异
-
一个Js文件函数中调用另一个Js文件函数的方法演示
-
Python中函数的基本定义与调用及内置函数详解
-
4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)
-
js New一个函数和直接调用的区别