JavaScript中this的理解

写在前面

这篇文章主要参考以下两篇文章学会js的thisjs中this彻底理解

首先,本文讨论的情况都是在一班情况下,并非strict mode,下面进入正题,先熟悉几条原则,后面会有具体实例

几条原则

  1. js中this在函数定义的时候是确定不了的,只有在函数运行的时候才能确定
  2. 如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window
  3. 如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。
  4. 如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象
  5. js中function也是对象,window是全局变量

js中call方法

看以下代码(弹出hello world)

        function hello(con){
            alert(this+" "+con);
        }
        hello.call("hello","world");

分析一下call()的用法

1. 把第二个到左后一个参数当做函数执行时传入的参数

2. 把函数执行时的this指向第一个参数

3. 执行函数

js执行函数的时候会默认执行以上的操作,即执行函数操作fun()相当于执行fun.call(window,p1..)

实例

        function a(){
            var user = "gray";
            alert(this.user); //undefined
            alert(this); //Window
        }
        a();
        //a();相当于window.a(),window中并没有定义user,因此是未定义
        var a= {
            user:"gray",
            fn:function(){
                alert(this.user);//gray
            }
        };
        a.fn();
        //相当于window.a.fn();这里用到了第三条原则,fn被上一级对象a调用,因此this指向的对象a
        var a= {
            user:"gray",
            fn:function(){
                alert(this.user);//undefined
            }
        };
        var b = a.fn;
        b();
        //这里b只是指向a.fn,并没有执行,而this是在执行时才能确定指向的,因此真正执行的b()相当于window.b();this指向window
        var a= {
            user:"gray",
            fn:function(){
                alert(this.user);//undefined
            }
        };
        var b = a.fn;
        b();
        //这里b只是指向a.fn,并没有执行,而this是在执行时才能确定指向的,因此真正执行的b()相当于window.b();this指向window

遇到return

        function fun(){
            this.user = "gray";
            return 1;
        }
        var f = new fun;
        alert(f.user);//gray
        function fun(){
            this.user = "gray";
            return {};
        }
        var f = new fun;
        alert(f.user);//undefined
        //如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。
时间: 2024-07-29 14:42:21

JavaScript中this的理解的相关文章

第二话:javascript中闭包的理解

闭包是什么? 通过闭包,子函数得以访问父函数的上下文环境,即使父函数已经结束执行. OK,我来简单叙述下,先上图. 都知道函数是javascript整个世界,对象是函数,方法是函数,并且js中实质性的面向对象相关也都是函数来实现和延伸,例如:"类". window:是指js中window类,也是js最高一层,因为什么这么说,因为你所有创建的方法和属性其实都在window之内.window中的所有方法,在自己创建的方法中都可以调到.可以仔细想想alert,在任何地方都可以alert,其实

Javascript中Function declarations 理解

首先来看一段代码: 1.f = function() {return true;}; 2.g = function() {return false;}; 3.(function() { 4. if (g() && [] == ![]) { 5. f = function f() {return false;}; 6. function g() {return true;} 7. } 8.})(); 9.console.log(f()); 理解上面这段code有几个关键点: 第4行code的

对JavaScript中this的理解

JavaScript中的this其实没传说中的那么难,也没那么乱. 我们来分析下,this主要是跟它的执行环境有关. 而通常情况下,this都是放在函数体中或可执行的JS代码中(函数体除外). 至于JS可执行代码中的this,用的不多,所以本文举例较少. 至于函数体中的this,我们只要弄清楚this所处的函数体是谁在调用,不就知道this是谁了吗? 注意:此文中的函数调用,是指该函数作为某对象的一个属性方法被执行,而不是单纯的在某个对象的作用域中执行就是调用 -----------------

对JavaScript中闭包的理解

相信很多人都有看过关于闭包的文章,但是真正意义上的了解清楚的也不多,今天我们就来谈谈对闭包的理解. 闭包在JavaScript中一直是一个很重要的存在,闭包很重要但是又很难理解,起初我也是这样认为,但只要真的清楚之后,你会觉得很有趣. 我们先来看一个闭包的例子: 1 function foo() { 2 let a = 2; 3 function bar() { 4 console.log(a); 5 } 6 return bar; 7 } 8 let baz = foo(); 9 baz();

Javascript中的EventLoop理解

原文来自 ruanyifeng.com 一年前,我写了一篇<什么是 Event Loop?>,谈了我对Event Loop的理解. 上个月,我偶然看到了Philip Roberts的演讲<Help, I'm stuck in an event-loop>.这才尴尬地发现,自己的理解是错的.我决定重写这个题目,详细.完整.正确地描述JavaScript引擎的内部运行机制.下面就是我的重写. 进入正文之前,插播一条消息.我的新书<ECMAScript 6入门>出版了(版权页

javascript中this的理解使用

this是javascript的关键字,也是对象,这个对象比较特殊,代表函数运行时自动生成的一个内部对象,只能在函数内部使用,随着函数使用场合的不同,this值会发生变化,但总的原则是不变的,就是this始终指向调用函数的那个对象 this的使用有很多种情形: 情形一:在全局环境下输出this值(这个this就代表当前的Window对象,值为Window) console.log(this); //Window 情形二:构造函数中的this (所谓构造函数,就是通过这个函数生成一个新对象(obj

javascript 中{}和[] 的理解

下面的一段解释是摘抄的,基本理解正确,做个记录.其实js中数组其实就是对象,typeof(['a', 'b', 'c'])//测试之后结果为 :  "object" 一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数.如:var LangShen = {"Name":"Langshen","AGE":"28"};上面声明了一个名为“LangShen”的对象,多个属性或函数用,(逗

JavaScript 中一些概念理解 :clientX、clientY、offsetX、offsetY、screenX、screenY

clientX 设置或获取鼠标指针位置相对于窗口客户区域的 x 坐标,其中客户区域不包括窗口自身的控件和滚动条. clientY 设置或获取鼠标指针位置相对于窗口客户区域的 y 坐标,其中客户区域不包括窗口自身的控件和滚动条. offsetX 设置或获取鼠标指针位置相对于触发事件的(this)对象的 x 坐标. offsetY 设置或获取鼠标指针位置相对于触发事件的(this)对象的 y 坐标. screenX 设置或获取获取鼠标指针位置相对于用户屏幕的 x 坐标. screenY 设置或获取鼠

理解 JavaScript 中的 this

前言 理解this是我们要深入理解 JavaScript 中必不可少的一个步骤,同时只有理解了 this,你才能更加清晰地写出与自己预期一致的 JavaScript 代码. 本文是这系列的第三篇,往期文章: 理解 JavaScript 中的作用域 理解 JavaScript 中的闭包 什么是 this 消除误解 在解释什么是this之前,需要先纠正大部分人对this的误解,常见的误解有: 指向函数自身. 指向它所在的作用域. 关于为何会误解的原因这里不多讲,这里只给出结论,有兴趣可以自行查询资料