zoukankan      html  css  js  c++  java
  • (转载)JavaScript中匿名函数,函数直接量和闭包

    首先,我们先看看下面几种写法:
    1.function f(x){return x*x;};f(x);
    2.(function(x){return x*x;})(x);
    3.(function(x){return x*x;}(x));

    第一种我们应该都很熟悉了,这是我们经常使用的写法。第二第三种都是匿名函数的写法。
    --------------------------------------------------------------------------------
    第二种
    可以这样理解:
    var f=function(x) {return x*x;};f()
    那我们不通过f这个变量来引用函数就是
    function(){}()
    然而这样肯定是错误的就像
    var f=1+2; f=f*0;

    var f=1+2*0;

    结果不同一样。
    要得到正确结果只能:
    f=(1+2)*0;
    也就是要明确的标识出程序块,即:
    (function(){})()

    肯你有疑问:括号"()"到底是不是起到了标识代码块的作用?
    我们可以用JavaScript的内置函数检测一下!
    举一个最简单的例子:
    alert(4)
    这段代码会弹出提示内容是“4”
    改成这样
    (alert)(4)
    可以看到执行的效果和上一段代码一样。
    这种形式的函数执行也被很多JavaScript框架所采用。
    --------------------------------------------------------------------------------
    第三种,如果你用过jsvm框架的话就会发现里面的代码使用了这种形式。
    那如何解释第三种情况呢?
    为了弄明白浏览器是如何理解这样的写法的,我们可以利用一下Mozilla Firefox的错误控制台功能。
    在代码中插入一段错误代码,代码段如下:
    (function(s){s+s}(1)).splice();
    打开Mozilla Firefox的错误控制台,可以看到有如下的错误提示
    错误: (function (s) {})(1) has no properties
    行:18
    可以认为,浏览器对于
    (function(s){s+s}(1))
    这样的代码按照
    (function (s) {s+s})(1)
    来解析的。

    --------------------------------------------------------------------------------
    到此可能你有这样的认识:
    function f(x){return x*x;};f(x);==(function(x){return x*x;})(x);==(function(x){return x*x;}(x));

    但是他们还是有区别的,
    首先,对于像第二和第三种形式,其它的函数和代码是不可能调用所定义的函数的,有一种说发把这样的函数称为匿名函数或者函数直接量。
    其次,第二和第三种形式执行的函数,中间变量不会污染到全局命名空间,你可以把中间的代码看作纯粹的子过程调用。
    当然使用后面两种形式的函数定义可以很容易的实现闭包。

  • 相关阅读:
    数据恢复
    InnoDB LRU优化
    STM32 M0之SPI
    C# 添加日志文件
    VCI_CAN二次开发摘机
    [一点感触]ADF4350 ADF4111混频记
    Linux札记
    C# String与Byte数组的转换
    STM32 CAN
    stm32 F40x CCM数据区的使用
  • 原文地址:https://www.cnblogs.com/Venom/p/JavaScript.html
Copyright © 2011-2022 走看看