JavaScript 中的 this 为一个重难点,它不像静态语言 C#、Java 一样,就表示当前对象。而在 JS 中, this 是运行时确定,而并非定义时就已确定其值。

谈起 this ,必须少不了 JavaScript 另一个重点:函数,在 JS 中函数有以下几种定义方法。

   // 函数声明
function fun(){ } // 函数表达式
var fun=function(){ }; // Function 构造函数
var fun=new Function (arg1, arg2, ... argN, functionBody) arg1 arg2 .... 为函数形参 functionBody 为函数主体

一   this 指向 window  

 function  f(){

   console.dir(this);
console.dir(this.f===f);
console.dir(this===window) } f(); // 此时,可视 f 为 window 对象下定义的一个属性,f() 可视为由 window 进行调用,此时,this 即指向 window

    二   this 指向当前对象

 var obj={name:"jack",age:20,say:function()
{
console.dir(this);
console.dir(this===obj);
alert(this.name); }}; obj.say(); // 通过 obj 对象调用 say 方法,而此时 say 方法即指向当前对象

 三  this 指向通过构造器函数所创建的对象

   

 var Person=function(name,age)
{
this.Name=name;
this.Age=age;
console.dir(this); }; new Person("jack",20); Person("jack",20); // 前者通过 new 关键词,调用 Person 函数,此时,this 指向当前构造器函数所创建的对象 // 而后者,直接调用 Person 函数,参考第一条,可视为 window.Person(),此时,this 指向 window

 四   this 在原型中,指向通过该构造器函数创建的对象(同 new )

   

 var Person=function(name,age)
{
this.Name=name;
this.Age=age; }; Person.prototype.say=function()
{
console.dir(this); } new Person(“jack”,20).say(); // 首选,以 Person 为构造器创建对象,再调用 say 方法,此时,this 指向以该构造器造建的函数对象

       最后,看看几个容易引起误解的地方 ,有关该函数中 this 指向,关于以下两个,本人仅仅通过 chrome 控制台及调试,原理性感觉用 Java、C# 的无法解释。

 var f={name:'jack',age:20,say:function()
{
console.dir(this);
console.dir(this.name); }}; var f1=f.say; f1(); console.dir(window.name); // 将 f 对象中 say 属性(say 为函数)赋值给 f1 变量,而此时,通过 f1()调用,此时,this 指向 window,并非 f 对象


 var f=function()
{
console.dir(this); var f1=function()
{ console.dir(this);
console.dir(this===f); }; f1(); }; f(); // 在函数中,再定义一个函数时,同时,在外层函数中调用该函数,而此时 ,this 并非指向外层函数对象,而是指向 window

参考资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions

  
 

谈谈 JavaScript 中的 this 指向问题的更多相关文章

  1. 谈谈javascript中的prototype与继承

    谈谈javascript中的prototype与继承 今天想谈谈javascript中的prototype. 通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性 ...

  2. javascript中this的指向

    作为一个前端小白在开发中对于this的指向问题有时候总是会模糊,于是花时间研究了一番. 首先this是JS的关键字,this是js函数在运行是生成的一个内部对象,生成的这个this只能在函数内部使用. ...

  3. Javascript中的this指向。

    一.JavaScript中的函数 在了解this指向之前,要先弄明白函数执行时它的执行环境是如何创建的,这样可以更清楚的去理解JavaScript中的this指向. function fn(x,y,n ...

  4. JavaScript中 this 的指向

    很多人都会被JavaScript中this的指向(也就是函数在调用时的调用上下文)弄晕,这里做一下总结: 首先,顶层的this指向全局对象. 函数中的this按照调用方法的不同,其指向也不同: 1.函 ...

  5. 前端面试之JavaScript中this的指向【待完善!】

    JavaScript中this的指向问题! 另一个特殊的对象是 this,它在标准函数和箭头函数中有不同的行为. 在标准函数中, this 引用的是把函数当成方法调用的上下文对象,这时候通常称其为 t ...

  6. JavaScript中的this指向

    this是谁 技术一般水平有限,有什么错的地方,望大家指正. this代指当前对象super调用父类的构造函数,应表会运网数物,加载驱动建立链接执行SQL处理结果,直到现在每想起这三点就能想起我上大学 ...

  7. Javascript 中的this 指向的对象,你搞清楚了吗?

    Javascript 中的this 总让人感到困惑,你能分清以下三种test1(),test2(),test3() 情况下的输出吗? 注:以下Javascript运行环境中为浏览器 //1 this在 ...

  8. javascript中的this指向问题

    在深入学习JavaScript之后,我们越来越多的会遇到函数或者在对象内部中,对于this的指向问题的疑惑,其实基本上每一个编程语言中都有一个this,这个this的指向都是大同小异,你也可以汉化它的 ...

  9. JavaScript中this的指向问题

    this是面向对象语言中一个重要的关键字,理解并掌握该关键字的使用对于我们代码的健壮性及优美性至关重要.而javascript的this又有区别于Java.C#等纯面向对象的语言,这使得this更加扑 ...

随机推荐

  1. LeetCode Triangle 三角形(最短路)

    题意:给一个用序列堆成的三角形,第n层的元素个数为n,从顶往下,每个元素可以选择与自己最近的两个下层元素往下走,类似一棵二叉树,求最短路. [], [,4], [6,,7], [4,,8,3] 注意: ...

  2. Windows环境自动获取AWR报告

    1.双击awr.cmd,通过cmd窗口运行awr.sql cmd.exe /c sqlplus lcam_1230/zcpzg1z_1230@54_orcl @awr.sql awr.cmd 2.aw ...

  3. 国外主流PHP框架比较

    最近简单的使用了目前在国内用的比较多的几个主流国外PHP框架(不包括国内框架),大致对这些框架有个直观上的感受,简单分享一下,对于哪些做框架选型的时候,权当一个参考. 主要参考的框架包括:CodeIg ...

  4. shell小技巧

    # awk '{a[$1]++;a[$2]++}END{for (i in a)print i "\t" a[i]}' list | grep -w 2 | awk '{print ...

  5. web.config配置详细说明

    (一).Web.Config是以XML文件规范存储,配置文件分为以下格式 1.配置节处理程序声明    特点:位于配置文件的顶部,包含在<configSections>标志中. 2.特定应 ...

  6. tools/adb: No such file or directory

    运行adb出现这种错误: bash: ./adb: No such file or directory   但adb确实存在.那说明你用的是64位的Linux,没装32位运行时库,安装 $ sudo  ...

  7. HDU5787 K-wolf Number 数位dp

    分析:赛场上也知道是裸的数位dp,但是无奈刷数位dp题刷的太少了,并不能写出来 一点感想:赛后补题,看了题解的map记录状态,一脸蒙逼,也是非常的不爽,然后想看别人写的,不是递归就是写的比较乱 而且我 ...

  8. QT4.7.4-vs2008和vs2010的安装并编写测试程序

    QT的安装着实费了我好大的劲,之前试过QT5.1.0与VS2010的安装,但是因为设置的地方太多,程序运行总是不成功,所以最后选用QT4.7.4和VS2008与VS2010来编写程序.写这篇文章来总结 ...

  9. cocos2d-x 不能在android真机debug的问题

    最近在做cocos2d-x开发的时候,发现在android真机上不能调试C++代码,显示如下警告信息 Ignoring packet error, continuing... warning: unr ...

  10. (转载)OC学习篇之---类的三大特性:封装,继承,多态

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...