• Js中的this关键字(吉木自学)


    研究生毕业答辩完,开始继续为转行努力。小白要奋斗了,加油。本文引自JS核心系列:浅谈函数的作用域

    在一个函数中,this总是指向当前函数的所有者对象,this总是在运行时才能确定其具体的指向, 也才能知道它的调用对象。

    1 window.name = "window";
    2 function f(){
    3     console.log(this.name);
    4 }
    5 f();//输出window
    6 
    7 var obj = {name:'obj'};
    8 f.call(obj); //输出obj

    在执行f()时,此时f()的调用者是window对象,因此输出"window"。

    f.call(obj) 是把f()放在obj对象上执行,相当于obj.f(),此时f中的this就是obj,所以输出的是"obj"。

     code1:

     1 var foo = "window";
     2 var obj = {
     3     foo : "obj",
     4     getFoo : function(){
     5         return function(){
     6             return this.foo;
     7         };
     8     }
     9 };
    10 var f = obj.getFoo();
    11 console.log(1+":"+f()); //输出window

     code2:

     1 var foo = "window";
     2 var obj = {
     3     foo : "obj",
     4     getFoo : function(){
     5         var that = this;
     6         return function(){
     7             return that.foo;
     8         };
     9     }
    10 };
    11 var f = obj.getFoo();
    12 console.log(f()); //输出obj

    code1:
    执行var f = obj.getFoo()返回的是一个匿名函数,相当于:
    var f = function(){
    return this.foo;
    }
    f() 相当于window.f(), 因此f中的this指向的是window对象,this.foo相当于window.foo, 所以f()返回"window"

    code2:
    执行var f = obj.getFoo() 同样返回匿名函数,即:
    var f = function(){
    return that.foo;
    }
    唯一不同的是f中的this变成了that, 要知道that是哪个对象之前,先确定f的作用域链:f->getFoo->window 并在该链条上查找that,此时可以发现that指代的是getFoo中的this, getFoo中的this指向其运行时的调用者,从var f = obj.getFoo() 可知此时this指向的是obj对象,因此that.foo 就相当于obj.foo,所以f()返回"obj"。

    对作用域链不清楚的同学可以参看JavaScript从作用域到闭包

  • 相关阅读:
    Android Studio教程-创建第一个项目Hello World
    java打jar包的几种方式详解
    低学历者如何逆袭
    strlen, wcslen, _mbslen, _mbslen_l, _mbstrlen, _mbstrlen_l, setlocale(LC_CTYPE, "Japanese_Japan")(MSDN的官方示例)
    select, poll, epoll
    KVM虚拟化知识的一些笔记
    在Windows系统上以C++打印出当前活动用户的环境变量
    日志组件解析
    Angular2案例rebirth开源
    视图
  • 原文地址:https://www.cnblogs.com/jkj-jim/p/6479930.html
Copyright © 2020-2023  润新知