JavaScript函数理解(一) -- 函数嵌套与闭包入门

来源:互联网 发布:数据统计表模板 编辑:程序博客网 时间:2024/04/27 19:52

   【嵌套函数】
  JavaScript允许在函数内部嵌套定义函数,允许函数用作数据错位参数传递给另一个函数(JavaScript中所有函数都可以看做对象),并且在函数词法作用域下面,可以产生与传统面向对象语言不同的惊人地方。
  首先,JavaScript的函数是通过词法来划分作用域的,而不是动态的划分作用域的,于是,函数的是在定义它们的作用域中运行,而不是在执行它们的作用域中运行,所以,当嵌套函数和它的外围函数定义在同一个词法作用域中的时候,是很容易理解的。

    1:在JavaScript中函数可以嵌套在另一个函数中进行定义(有点儿类似与Java中的内部类,机制有些不同--理解时可以进行类比学习,温故而知新!)

function distance(x1, y1, x2, y2) {    function square (x) {        return x * x;    }        return Math.sqrt(square(x1 - x2) + square(y1 - y2));}var result = distance(0, 0, 3, 4);console.log(result); // 5
在上面的代码片段中,函数distance中嵌套定义了函数square。这时,函数square只能在distance中被调用。如果我们想要在distance之外调用square函数,由于JavaScript中函数执行环境和变量作用域的限制,我们将得到一个很不友好的错误提示!

    2:结合嵌套函数更通俗易懂的理解一下JavaScript中的闭包:如果内部的嵌套函数使用了外部函数的变量或者参数,那么内部函数就形成了一个闭包(Closure)。-- 闭包的具体理解在另一篇笔记里面有记录!

    闭包的特性:

    1):闭包能够在起嵌套的外部函数执行完之后继续访问外部函数的变量和参数

 --这与JS的函数执行环境和变量作用域链有着密切关系。此处复习记忆一下。

     2):闭包中包含指向外部函数的引用

  --采用Chrome浏览器调试时,可以很直观的进行验证。

     3):在闭包中想要在访问外部函数的this对象时,需要我们在进入闭包之前就进行指定。通常的做法是在进入闭包之前声明: var self = this; 在闭包中采用self引用外部函数的this对象。写到这里突然想来关于JS中的this指向问题,忘记上传自己的笔记了,这里先引用一篇文章‘深入浅出 JavaScript 中的 this’,之后再补上自己的学习笔记。

     4):闭包有两个比较常用的用途,一个是可以利用它访问到局部变量,另一个是可以把它外围作用域中的变量值存储在内存中而不在函数调用完毕后就销毁。(别的还有诸如模拟私有变量和函数等等)。

-- 其实所有的JavaScript函数都可以说是闭包,但是只有当一个嵌套函数被导出到它所定义的作用域之外时,这种闭包才是有趣的


 




0 0