this指向和变量作用域链&new 构造函数

114 阅读2分钟

1、this指向,函数被一个对象当作属性调用,则这个this指向这个对象。

2、this指向,匿名函数自执行的话this指向的是window。

3、this指向,函数自执行的this指向都是window。

在js权威指南中,函数的调用分为四种情况:

----作为函数: 这种纯粹的函数调用,通常指的环境是全局,this指向的是window(非严格模式),或者undefined(严格模式)。以下写的都是非严格模式下的结果:

和变量不同,关键字this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this,如果嵌套函数作为函数调用,其this值不是全局对象就是undefined。

======作为方法: 作为方法调用时,它的this指向的是调用它的最近的那一个对象

=====作为构造函数: 如果函数或者方法调用之前带有new关键字,它就构成构造函数调用

先了解一下new这个关键字来调用构造函数会发生什么实际的步骤:
1)创建一个新对象
2)将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
3)执行构造函数中的代码(为这个新对象添加属性)
4)返回新对象

======通过它们的apply和call方法调用: 这两个方法都能显式指定this的值。 apply和call这两个方法的第一个参数就代表着这个函数会被哪个对象来调用。那么这个this就会被指定成这个对象。

作用域分为,静态作用域和动态作用域。js使用的是静态作用域

1、静态作用域 也叫词法作用域,代码写完后变量的作用域就确定不变了。如果函数中变量没有在该函数中定义,则就去定义该函数的地方查找

2、动态作用域 代码写完后,作用域还无法确定,它和调用它所在的函数有关。

new 构造函数过程: new myFunction{ var obj = {}; obj.proto = myFunction.prototype; var result = myFunction.call(obj,"Li","Cherry"); return typeof result === ‘obj‘? result : obj; }

(1) 创建一个新对象; (2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象); (3) 执行构造函数中的代码(为这个新对象添加属性); (4) 返回新对象。 (如果无返回值或者返回一个非对象值,则将 obj 返回作为新对象;如果返回值是一个新对象的话那么直接直接返回该对象。)