`
desert3
  • 浏览: 2159244 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

Javascript函数:函数声明、函数表达式、NFE被命名的函数表达式

 
阅读更多
参考:
functions-declarations-and-expressions

在Javascript中,函数象变量一样可以在任何地方被定义
Javascript中定义函数有如下3种方式:
  • 1,函数声明
  • 2,函数表达式
  • 3,调用new Function的返回结果

函数声明语法:注意,函数声明的时候,后面不需要跟分号来和其他代码分隔开来。
function Identifier ( FormalParameterListopt ) { FunctionBody }

// 其他的像for循环、if判断的大括号后面,也都没有分号。
for (variable=startvalue;variable<endvalue;variable=variable+increment)
  {
  code to be executed
  }

if (condition)
  {
  code to be executed if condition is true
  }
else
  {
  code to be executed if condition is not true
  }

函数声明的名字在函数内部和函数所在的parent的内部可见!
函数声明在预执行期(即在浏览器准备执行代码的时候、正式执行代码之前)被解析。因此,使用函数声明方式定义的函数,即可以在声明之前调用,也可以在声明之后调用。如下
// 能正常工作
function sayHi(name) {
  alert("Hi, "+name)
}

sayHi("John");

// 也能正常工作
sayHi("John");

function sayHi(name) {
  alert("Hi, "+name)
}

函数可以在代码的任何地方被声明:看如下列子
sayHi();

if (1) {
  function sayHi() {  alert(1)  }
} else {
  function sayHi() {  alert(2)  } // <--
}

试着在不同的浏览器执行上述代码,在FirefoxF14中,执行上述代码无反应。其他浏览器返回2。
这是因为函数声明是在执行前被解析。根据规范(p.10.5),后面的具有相同名字的函数声明 覆盖前面已经存在的函数声明。
当到执行期的时候,这些声明代码被忽略。因此if判断其实本身不影响什么东西。

函数表达式语法:
函数在Javascript中是一等公民,象数字、字符串一样。任何你可以放置值的地方,你也可以放置一个函数。
函数表达式就是:任何包含函数function(arguments) { ... }的表达式。注意:如下表达式声明的最后跟着双引号分隔符。如果在函数表达式中的function也有自己的名字,那么这个名字只在函数内部可见:参考NFE(Named function expressions)被命名的函数表达式
函数表达式语法例子1:
var f = function(arguments) {
   ... code ... 
};

函数表达式语法例子2:创建匿名函数、同时执行被创建的匿名函数
为什么函数在方括号里面:因为Javascript只允许函数表达式在这里被执行。
(function() {

  var a, b    // local variables 
 
  // ...      // and the code 

})();

怎么区分:函数声明、函数表达式
当Javascript在主代码流中解析函数时,这是函数声明。否则,当函数作为statement的一部分时,就是函数表达式。

当Javascript的执行流到达时,函数表达式才会被创建。因此,函数表达式只能在声明之后使用。
var sayHi;

// sayHi(); <-- 不能在这里调用sayHi函数,因此此时,sayHi还不存在。

if (1) {
  sayHi = function() {  alert(1)  };
} else {
  sayHi = function() {  alert(2)  };
}

sayHi();

建议:尽量使用函数声明而不是函数表达式。函数表达式只在需要的时候才使用:如使用条件函数定义
  • 1,函数声明可读性更加好,代码更加简短
  • 2,函数声明能在声明之前被调用

函数声明和函数表达式都是定义一个变量,然后把一个函数放进去。不同的是他们的创建时间:函数声明在预执行期,函数表达式在执行期

第三种定义函数的方式:使用new Function,如下,很少使用这种方式。
var sayHi = new Function('name', ' alert("Hi, "+name) ');

sayHi("Benedict");

NFE(Named function expressions)被命名的函数表达式:如下的函数表达式,就包含自己的名字
var f = function sayHi(name) {
  alert("Hi, "+name)
};

上面的语法就被叫做NFE(被命名的函数表达式)。在支持这种语法的浏览器中,function声明的名字只在函数内部可见。如下:Firefox14中,sayHi1的名字在函数外面调用不到!IE8可以!
var f = function sayHi(name) {
  alert(sayHi);
};
f(1);
sayHi(1);

NFE一般被用在递归调用的地方。
分享到:
评论

相关推荐

    揭秘命名函数表达式1

    **命名函数表达式**(Named Function Expression, NFE)是函数表达式的一个特殊情况,即使在函数表达式中给出了一个名字,如`var bar = function foo() {}`。这个名字`foo`只在函数体内部可用,外部无法访问,因此...

    JS 有名函数表达式全面解析

    - 在编写代码时避免使用命名函数表达式,除非确保其标识符不会被错误地访问。 - 如果必须使用命名函数表达式,建议在内部使用,避免造成作用域污染。 ##### 实例2:有名函数表达式被当作函数声明和函数表达式处理 `...

    javascript函数

    - **有名函数表达式**(NFE): ```javascript var add = function foo(a, b) { // do something }; ``` ##### 声明与表达式的区别 - **提升行为**:只有函数声明会被提升。 - **可读性**:函数声明通常更易于...

    跟我学习javascript的函数和函数表达式

    命名函数表达式(Named Function Expression,NFE)是函数表达式的一种特例,它有一个名字,但这个名称的作用域仅限于函数内部。这意味着函数外部无法通过名称访问该函数,只能通过变量来调用。命名函数表达式的好处...

    JS函数总结

    函数声明具有函数名,而函数表达式可以没有函数名或者使用命名函数表达式(NFE)。 ```javascript // 函数声明 function add(a, b) { // ... } // 匿名函数表达式 var add = function(a, b) { // ... }; // ...

    JavaScript中指定函数名称的相关方法

    如果函数表达式包含名称,则它被称为命名函数表达式(Named Function Expression, NFE)。在JavaScript 1.2及更高版本中,引入了函数文本的概念,它允许我们通过函数表达式定义函数。 对于函数文本或命名函数表达式...

    深入理解JavaScript系列

    该章节深入探讨了JavaScript中的命名函数表达式(Named Function Expression, NFE)。NFE 是一种特殊的函数表达式形式,它允许函数自身有一个名称,这在调试和递归调用时非常有用。 - **命名函数表达式的定义与用法...

    JavaScript函数定义的常见注意事项小结

    命名函数表达式(Named Function Expression, NFE)是一个特殊的函数表达式,其中函数有一个内部名称。然而,这个名称仅在函数体内部可见,非IE浏览器中外部不可见。因此,以下代码在非IE浏览器中会导致错误: ```...

    js代码-NFE其实就简单两条规则,1.只能在函数体内访问,2.函数名变量可以理解为常量,不可变

    JavaScript中的NFE,全称为Named Function Expressions(命名函数表达式),是JavaScript中定义函数的一种方式,它与Function Declaration(函数声明)有所不同。NFE的主要特点是它的匿名性和可命名性,这种特性使得...

Global site tag (gtag.js) - Google Analytics