javascript 作用域链认识

来源:互联网 发布:电脑程序编程 编辑:程序博客网 时间:2024/06/03 16:36

作用域链作用:保证执行环境里有权访问的变量和函数时有序的,作用域链的变量只能向上一级一级的访问,访问到window对象即被终止,作用域链向下访问变量是不被允许的。


(1):当页面加载的时候首先加载js,既script标签下的js代码,会按顺序执行,而这些能被执行的代码都是属于window的变量或函数;(script下定义的对象或函数(由function定义的)是不被执行的)

可知js中运行环境有两类:

一类是全局执行环境,即window代表的全局环境

一类是函数代表的函数执行环境,即局部作用域


(2)什么是作用域链?

js中有一个概念,执行环境栈 execution context stack,当一个函数的执行环境压入到执行环境栈里,这个时候就会在上下文变量里构造一个对象,这个对象就是作用域链scope chain;同时还会构造一个this对象,this对象也是属于上下文变量,而this变量的值就是当前执行环境外部上下文变量的一个拷贝,这个拷贝没有作用域变量.如:

其中qk1和qk2里的this里指针都是指向window,这是为什么呢?哈哈!

因为在js里我们定义函数方式是通过function 形式定义的,而这个函数不管指针定义在哪里,它都属于全局对象window


但我们知道很多this指针不是指向window的,如:

会发现this指针指向对象Object了,为什么呢?看下另一种写法

这两种写法是等价的,第一种对象定义叫做字面变量定义,第二种是标准写法,Object对象的本质也是一个function,所以当调用对象里函数时,函数的外部执行环境就是qk本身。

这得说到另一个知识,即js里通过new、apply、call改变函数的this指针,函数this指针都是指向window的



0 0