函数申明和函数表达式

1.js解析器会优先读取函数申明,即使函数调用在申明之前,

   aaa();
  //函数申明
    function aaa(){
        alert(1);    // 1
    }

而函数表达式必须等到执行到它所在的代码行时,才会被解释执行,如果提前调用,则会报错,

bbb();
  //函数表达式
    var bbb = function(){
        alert(2);   // TypeError: bbb is not a function
    }

2.当函数申明的函数名与变量重复时(不推荐这样的做法),会优先解析函数申明,

function a(){
        var ccc;
        alert(typeof ccc);  //function
        function ccc(){

        }
    }
    a();

3.(function(){})()——这种形式也是函数表达式。

4.具名函数表达式,也叫作自执行函数:比如

var ddd = function sum(){}

此时,只能通过ddd()来执行函数,外部不能调用sum()来执行,函数内部则可以访问到sum(),

var ddd = function sum(){
        console.log(‘内部的sum是‘+typeof sum);  //内部的sum是function
    }
    console.log(‘外部的sum是‘+typeof sum);   //外部的sum是undefined
    ddd();

5.对象内部的函数表达式,在函数表达式内部能不能访问存放当前函数的变量。

var o = {
        aaa:function(){
            console.log(aaa);
        }
    }
    o.aaa();  //ReferenceError: aaa is not defined

有一个例子:

function fn(){                    ①
        return {
            fn:function(){        ②
                return fn();      ③
            };
        }
    }

①fn执行的时候,返回了一个对象,假设接着又调用了这个对象中的fn②,返回的fn③其实就是fn①,因为刚才上面的例子说了,对象内的函数表达式的内部fn③无法访问到fn②。

function fn(a, b){
        console.log(b);
        return {
            fn:function(c){
                return fn(c, a);
            }
        }
    }

    var one = fn(1);   //undefined
    var two = one.fn(0);  // 1

第5条是受到《大部分人都会做错的经典JS闭包面试题》中启发。

时间: 2024-10-27 12:09:40

函数申明和函数表达式的相关文章

函数申明对函数模板实例化的屏蔽

1.C++函数匹配顺序 C++语言引入模板机制后,函数调用的情形显的比C语言要复杂.当发生一次函数调用时,如果存在多个同名函数,则C++编译器将按照如下的顺序寻找对应的函数定义. (1)寻找一个参数完全匹配的函数,如果找到了就调用它. (2)寻找一个函数模板,并根据调用情况进行参数推演,如果推演成功则将其实例化,并调用相应的模板函数. (3)如果前面两种努力都失败了,则试着低一级的函数匹配方法,如通过类型转换能否达到参数匹配,如果可以,则调用它. 2. 函数申明对函数模板实例化的屏蔽 如果使用了

函数声明和函数表达式的理解

JScript和ECMAScript的变现不一致,但是对于现在的w3c规范来说都是遵循ECMAScript的.所以函数申明和函数表达式对JScript的表现在此就不做过多的介绍,可以移步汤姆大叔blog深入学习:揭秘命名函数表达式 1 function foo(){ return 1; }//函数声明 2 var foo = function(){ return 1; };//函数表达式 1 function a(){ 2 alert(foo());//1 3 function foo(){ r

函数声明vs 函数表达式

var a = 10; function fn() { //函数申明 //var a; alert(a); var a = 100; //申明被提前到了当前作用域的最开始 alert(a); } //fn(); //undefined 100 /* * var a; * * fn; * * a = 10; * * fn(); * */ alert(fn1); //undefined //函数表达式,申明一个变量fn1,赋值了一个函数 var fn1 = function() { alert(1)

javascript 函数声明和函数表达式的区别(学习笔记)

javascript中声明函数的方法有两种:函数声明式和函数表达式. 区别如下: 1).以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的. 2).以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用. 3).以函数声明的方法定义的函数并不是真正的声明,它们仅仅可以出现在全局中,或者嵌套在其他的函数中,但是它们不能出现在循环,条件或者try/catch/finally中,而 函数表达式可以在任何地方声明. 下面分别用两种方法定义函数:

函数声明与函数表达式的区别

1.函数声明 函数声明以function关键字开头,接着是必须的函数(变量)名和以逗号分隔的可选的参数列表,再接着就是以大括号封装的函数体.函数声明必须是一个单独的JavaScript语句. 2.函数表达式 在任何情况下都是其它JavaScript语句的一部分(比如复制表达式等号的右侧.函数的参数)的函数被称为函数表达式. 3.比较 //函数声明function myFunctionDeclaration(){ function innerFunction() {} } //以下为函数表达式 v

函数声明与函数表达式

1.什么是函数声明,函数表达式 函数声明:function 函数名(){} 函数表达式:function 函数名(){}.函数名可写可不写.写出来的,就是命名函数表达式,不写的就是匿名函数表达式 例子: function aaa(){};这就是函数声明 var a=function aaa(){};命名函数表达式 var a=function(){};匿名函数表达式 下面的都是函数表达式 (function aaa(){}) ~function aaa(){} -function aaa(){}

函数:声明和表达式

函数:声明和表达式 函数,像变量一样,可以在代码的任意地方定义它. JS 提供了几个方法去定义它们. 1.函数声明     (Function Declaration) 2.函数表达式  (Function Expression) 3.通过调用new Function 返回. 语法 创建一个函数的基本方法是通过一个函数声明.语法如下: function f(arg1, arg2, ...) {    ... code ... } 实现起来像这样子: 1 function sayHi(name)

Javascript中函数声明与函数表达式的不同

定义函数的方式有两种:一种是函数声明,另一种是函数表达式. 函数声明的语法如下: 1 function functionName(arg0,arg1,arg2){ 2 //函数体 3 } 函数表达式的语法如下: 1 var functionName = function(arg0,arg1,arg2){ 2 //函数体 3 } 两者的区别: 函数声明的特征就是函数声明提升,即执行代码之前js解析器会先读取函数声明,所以如下的代码不会提示错误. 1 sayHi(); 2 function sayH

javascript中函数声明和函数表达式浅析

记得在面试腾讯实习生的时候,面试官问了我这样一道问题. //下述两种声明方式有什么不同 function foo(){}; var bar = function foo(){}; 当初只知道两种声明方式一个是函数声明一个是函数表达式,具体有什么不同没能说得很好.最近正好看到这方面的书籍,就想好好总结一番. 在ECMAScript中,有两个最常用的创建函数对象的方法,即使用函数表达式或者使用函数声明.对此,ECMAScript规范明确了一点,即是,即函数声明 必须始终带有一个标识符(Identif