Javascript中构造函数要注意的一些坑

  

  

最近在家看的书:《你不知道的Javascript》,看到构造函数调用时会绑定,就顺便打开控制台输了一些代码,详细测试了一下。

  

构造函数简单的讲,即定义出来专供新式调用的函数。

  

<>强如:

        函数(b) {   这一点。b=| |“bbb”;   }      

然后你就可以通过新的,来构建一个一个的实例:

        var=新(B)      

但是,一个首要的坑是,构造函数与一个普通函数并无不同,如果你故意不使用新的,或忘记用新的,都会得到奇怪的错误:

        var aa=A (“adadada”);      

<强>这样调用,并不会显式地报错,但实际上隐患深埋:

  
      <李> aa并不是一个的实例,而变成了未定义的   <李>多了一个名为b的全局变量,值是“adadada”
      李   
  

  

下面说其他的:

  

<>强构造函数自身有返回值

  

比如:         函数(b) {   这一点。b=| |“bbb”;   返回{b:‘0000’};   }      

这个时候,无论是否使用新的来调用,得到的结果都会相同,即得到一个普通对象<代码>:{0000′b:}

  

当然,此时是否带新调用,还是有一个不同点的,即:不带新时,依然会莫名声明一个叫b的全局变量。

  

既然,构造函数有显式返回值时,会代替默认应该返回的,成为返回值,那么,是不是所有返回值都能覆盖这个呢?

  

<强>测试显式返回值

  

众所周知,函数都是有返回值的,只是如果没有回报,则会返回定义。

  

那么,我就在构造函数里显式返回一个定义,会怎么样?

        var=function () {。b=' b ';返回未定义的};   新();//{b: b}      

显式返回一个定义,并不能阻止构造函数式调用的默认行为。

  

<强>下图是更多测试:

  

 Javascript中构造函数要注意的一些坑

  

简单的总结:

  

显式的返回以下值:未定义,null,布尔值、数字等基础类型,并不会代替新式调用的默认行为。

  

但显式返回以下值:{},[],RegExp,日期,函数,均会代替新调用的默认返回值。

  

大家都看到了,后者,全都是对象,是复杂类型。

  

  

前面说过,本该进行新式调用的构造函数,被当作普通函数调用,那么,如果函数体中,有<代码>。x=xxx>   

原因相信大家都知道,而本书中也专门讲过:函数调用时,默认的这就是绑定至全局对象。

  

而本书还提到:如果函数体是严格模式,则不会绑定这至全局对象,如:

        var=function(){使用严格的;这一点。b=' b ';返回/111/g};   ();//直接报错      

因为严格模式下,默认的这个指向未定义的

  

所以说,有两点要提一下:

  
      <李>严格模式真不错李   <李>如果你想声明一个构造函数,那么严格模式是非常必要的
      李   
  

  

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript中构造函数要注意的一些坑