学习js函数--函数定义

函数的定义方法有三种

1.函数表达式

2.函数声明

3,new function构造函数

 

这边主要看下函数表达式和函数声明

函数表达式(未省略标志的)

var alertName = function nameAlert(name){

  alert("name" + "是大帅哥!");

};

alertName("博主");

函数表达式(省略标志的)

var alertName = function (name){

  alert("name" + "是大帅哥!");

};

alertName("博主");

函数声明

function nameAlert(name){

  alert("name" + "是大帅哥!");

};

nameAlert(“博主”);

 

函数声明和函数表达式的关系是非常微妙的。

1.函数声明 必须始终带有一个标识符(Identifier),也就是我们所说的函数名,而函数表达式则可以省略。

2.ECMAScript通过上下文来区分两者。

  假如 function foo(){} 是一个赋值表达式的一部分,则认为它是一个函数表达式。而如果 function foo(){} 被包含在一个函数体内,或者位于程序(的最上层)中,则将它作为一个函数声明来解析。

  我们来看几个例子

    

    function foo(){}; // 声明,因为它是程序的一部分
 
    var bar = function foo(){}; // 表达式,因为它是赋值表达(AssignmentExpression)的一部分
 
    new function bar(){}; // 表达式,因为它是New表达式(NewExpression)的一部分
 
    (function(){
        function bar(){}; // 声明,因为它是函数体(FunctionBody)的一部分
    })();

    (function foo(){})这也是函数表达式,因为在它被包含在一对圆括号中的函数,在其上下文环境中,()构成了一个分组操作符,而分组操作符只能包含表达式
    
    这样就可以改一个自执行函数,例如(function foo(){})();

 

3.函数声明和函数表达式还有个重要的区别:函数声明总是在作用域开始时先行解析,而函数表达式只会在遇到时才开始运算;

 举个例子 

sayTruth();<!-- 函数声明 -->
function sayTruth(){
    alert('myvin is handsome.');
}

sayTruth();<!-- 函数表达式 -->
var sayTruth=function(){
    alert('myvin is handsome.');
}

上面第一个由于函数声明能提前解析(在浏览器预执行代码的时候就执行了,在执行代码的时候就不执行了),所以能正常输出myvin is handsome.而第二个是不能正常输出的。事实上var 声明变量的话 变量被提前声明了,只是没有初始化而已

4.ECMAScript规范中表示,函数声明语句可以出现在全局代码中,或者内嵌在其他函数中,但是不能出现在循环、条件判、或者try/finally以及with语句中。这时候我们可以使用函数表达式

posted @ 2017-07-10 22:47  铸剑师  阅读(206)  评论(0编辑  收藏  举报