序
最近在家看书:《你不知道的Javascript》。当我看到调用构造函数时这是绑定的,我打开控制台输入了一些代码,并对其进行了详细的测试。
构造函数被简单地定义为一个由new专门调用的函数。
例如:
函数A(b){ this . b=b | | ' BBB ';}然后,您可以通过new:
Var a=new A('B ')然而,第一个坑是构造函数与普通函数没有什么不同。如果你故意不用新的或者忘记用新的,你会得到奇怪的错误:
var aa=A(' adada da ');这个调用不会显式报告错误,但实际上隐藏的危险很深:
Aa不是A的实例,而是变得未定义,带有一个名为B的全局变量,其值为“adadada”,这是没有新调用构造函数的坑。
下面我们来谈谈其他的:
构造函数本身有一个返回值
例如:
函数A(b){ this . b=b | | ' BBB ';返回{ b : ' 0000 ' };}此时无论是否使用new调用a,结果都是一样的,即得到一个公共对象:{b:'0000'}
当然,这时候用new调用是有区别的,就是没有new,一个叫b的全局变量还是会莫名其妙的被声明。
由于构造函数有一个显式的返回值,它会替换这个缺省情况下应该返回的值,成为返回值,那么所有的返回值都可以覆盖这个吗?
测试显式返回值
众所周知,所有函数都有返回值,但如果没有返回值,就会返回undefined。
那么,如果我在构造函数中显式返回一个未定义的呢?
var a=function(){ this . b=' b ';返回未定义的};新a();//{b:'b'}显式返回未定义的,这不能阻止构造函数调用的默认行为。
下图显示了更多测试:
简要总结:
显式返回以下值:undefined、null、boolean、number等基本类型,不会替换new call的默认行为。
但是,将显式返回以下值:{}、[]、regexp、date和function,所有这些都将替换新调用的默认返回值this。
正如你所看到的,后者,所有的对象,是一个复杂的类型。
随意记笔记
如前所述,新样式中应该调用的构造函数被视为普通的函数调用,所以如果函数体中有这样的赋值语句. x=xxx,它将被赋值给全局对象(即windows),成为一个全局变量。
相信大家都知道原因,而且这本书还专门说了,当一个函数被调用时,默认情况下这是绑定到一个全局对象的。
书中还提到,如果函数体处于严格模式,这将不会绑定到全局对象,例如:
var a=function (){ '使用strict ';this.b=' breturn/111/g };(a );//直接报告错误,因为在严格模式下,默认情况下这指向undefined
因此,有两点值得一提:
严格的模式真的很好。如果你想声明一个构造函数,严格模式是一个必要的总结
以上就是本文的全部内容。希望这篇文章的内容对你的学习或工作有所帮助。有问题可以留言交流。