js随笔 (你不知道的js)

Posted 大刁刁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js随笔 (你不知道的js)相关的知识,希望对你有一定的参考价值。

  

  很多开发者不会深入思考程序出现和预期不一样的结果,只会回避并用其他方法来达到目的

 

一.闭包

  无论通过何种方式将函数传递到词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个函数都会产生闭包。//reutrn 一个函数,回调一个函数

从上可以看出闭包需要的两个必要的条件,一是主体是函数(而且是内部函数),,二是函数在词法作用域以外被执行

 

 

二 .关于this

  this是在函数被调用时动态绑定的,而不是在编写时绑定。this的指向完全取决于函数在哪里被调用

  (1)调用位置  

  调用位置就是函数在代码中被调用的位置(而不是声明的位置)。最重要的是分析调用栈(就是为了到达当前执行位置所调用的所有函数)。我们关心的调用位置就在当前正在执行的函数的前一个调用中

                       

 

   (2)绑定规则  //找到调用位置,判断使用的是哪条绑定规则

  1. 默认绑定 。   //最常用的调用方式,直接调用不带任何修饰

    虽然 this 的绑定规则完全取决于调用位置,但是只有运行在非 strict mode 下时,默认绑定才能绑定到全局对象;严格模式下与 foo() 的调用位置无关,this绑定到undefined 

  2. 隐式绑定。 //调用位置是否有上下文对象,或者说是否被某个对象拥有或者包含

 

    当函数引用有上下文对象时,隐式绑定规则会把函数调用中的 this 绑定到这个上下文对象

                            

                                                  

 

    3. 显式绑定。 call()  apply() 

   4. new 绑定

  注意:如果你把 null 或者 undefined 作为 this 的绑定对象传入 call 、 apply 或者 bind ,这些值在调用时会被忽略,实际应用的是默认绑定规则

  小结: 

  如果要判断一个运行中函数的 this 绑定,就需要找到这个函数的直接调用位置。找到之后就可以顺序应用下面这四条规则来判断 this 的绑定对象。

  1. 由 new 调用?绑定到新创建的对象。
  2. 由 call 或者 apply (或者 bind )调用?绑定到指定的对象。
  3. 由上下文对象调用?绑定到那个上下文对象。
  4. 默认:在严格模式下绑定到 undefined ,否则绑定到全局对象。

 

 

三 .对象 

 

以上是关于js随笔 (你不知道的js)的主要内容,如果未能解决你的问题,请参考以下文章

《你不知道的JS(中卷)》对象

你不知道的js-行为委托

《你不知道的JS》提升

你不知道的JS系列 ( 33 ) - 对象复制

你不知道的JS来聊聊this

《你不知道的JS(中卷)》关于this