js函数的作用域链和this对象

每个执行环境都有一个与之关联的变量对象。虽然我们编写的代码无法访问这个对象,但是解析器会在后台使用它。


每个函数都有自己的执行环境。


(备注:综上所述,我们知道,函数、函数的执行环境、执行环境的变量对象是一一对应的关系。)


执行环境会创建变量对象的一个作用域链。
作用域链的用途,就是保证对执行环境有权访问的所有变量和函数的的有序访问。


作用域链的前端,始终是当前执行环境的变量对象。


如果这个环境是函数,则将其活动对象作为变量对象。
活动对象在最开始时只包含一个变量,即arguments对象。如果函数内定义了其他变量,则活动对象中会添加其它变量。


作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。
这样,一直延续到全局执行环境。


函数的执行环境开始时会先在自己的变量对象中搜索变量和函数名,如果搜索不到则再搜索上一级作用域链。


每个函数在被调用时都会自动取得两个特殊变量:this 和arguments。
内部函数在搜索这2个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这2个变量。
而对于其它变量,当其活动对象搜索不到时,会再搜索上一级作用域链。

摘自:《javascript高级程序设计》



(备注:当函数被调用时,活动对象会获得this对象)

(备注:对于this指针,只会搜索其执行对象的作用域。对于其它变量,当其活动对象搜索不到时,会再搜索上一级作用域链)


var x=3;
var a={
      x:2,
      b:{
       x:1,
       c:function(){return this.x;}}}


var c=a.b.c;     
alert(c());    返回3
alert(a.b.c());  返回1

---------------------------------------------------------------------------

var myObject = {
     foo:  "bar" ,
     func: function() {
         var self =  this ;
         console.log( this .foo);  
         console.log(self.foo);  
         (function() {
             console.log( this .foo);  
             console.log(self.foo);  
         }());
     }
};

myObject.func();



程序的输出是什么?

bar
bar
undefined
bar

this总是指向调用它的那个对象,如果是立即执行函数或者setTimeOut()这样的全局(window)函数则this指向的是window对象即this为全局的this.x中的x为全局变量
2.js的作用域链,如果本作用域着不到对象就向上一层找

第三个是闭包,this指向window,第四个self指向上一层的this

理解关键:方法/函数是由谁(对象)  调用 的,方法/函数内部的 this 就指向谁(该对象);
1、 这个立即执行匿名函数表达式(IIFE)是由window调用的,this指向 window 。
2、IIFE的作用域处于func的作用域中,本作用域找不到self变量,沿着作用域链向上查找self变量,找到了func作用域内的self。


你可能感兴趣的:(javascript)