JS进阶之---函数,当即执行函数

 

1、函数javascript

  函数声明、函数表达式、匿名函数java

    函数声明:使用function关键字声明一个函数,再指定一个函数名,叫函数声明。function name () { … }闭包

    函数表达式:使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式。var name = function(){ ... }函数

    匿名函数:使用function关键字声明一个函数,但未给函数命名,因此叫匿名函数。function () { ... }spa

 

  调用时的区别code

name();  //正常,由于‘提高'了函数声明,函数调用可在函数声明以前
function name(){ ... } name(); //报错,变量name还未保存对函数的引用,函数调用必须在函数表达式以后
var name=function(){ ... }

 

  函数参数传递方式:按值传递对象

  咱们知道,函数的参数在进入函数后,实际是被保存在了函数的变量对象中,所以,这个时候至关于发生了一次复制。blog

var a = 20;
function fn(a) {
    a = a + 10;
    return a;
}
fn(a);
console.log(a); // 20

var a = { m: 10, n: 20 }
function fn(a) {
    a.m = 20;
    return a;
}
fn(a);
console.log(a);   // { m: 20, n: 20 }

  函数参数传递方式是按值传递,只不过当咱们指望传递一个引用类型时,真正传递的,只是这个引用类型保存在变量对象中的引用而已。token

 

 

2、当即执行函数ip

  两种javascript当即执行函数的常见写法。

(function(){
    …
})()  //(...)()形式

(function(){
    …
}())  //(...())形式

 

  在函数的后面加上括号,就能变成当即执行函数吗?

  1.函数表达式后面加括号

var name=function(){
    alert('Hello World');
}();  //函数表达式。后面加括号,当javascript引擎解析到此处时能当即调用函数

 

  2.匿名函数后面加括号

function(){
    console.log('Hello World');    
}();  //匿名函数方式。后面加括号,报语法错误。虽然匿名函数属于函数表达式,可是未进行赋值操做,因此javascript引擎将开头的function关键字当作函数声明,报错:要求须要一个函数名。

 

  3.函数声明方式后面加括号

function name(){
    alert('Hello World');
}();  //函数声明方式,此时至关于对匿名函数加了名字。后面加括号,仍是报错,Uncaught SyntaxError: Unexpected token )。在一个表达式后面加上括号(),该表达式会当即执行,可是在一个语句后面加上括号(),它的意思只是分组操做符。

  function name(){
    alert('Hello World');
  }(1); //若是在括弧()里传入一个表达式,将不会有异常抛出.可是函数依然不会执行。由于它彻底等价于,在一个function声明后面,又声明了一个毫无关系的表达式

 

  回头看看( function(){…} )()和( function (){…} () ),要在函数体后面加括号就能当即调用,则这个函数必须是函数表达式,不能是函数声明。

  因此只须要用大括弧将代码括住就好了,由于JavaScript里括弧()里面不能包含语句,因此在这一点上,解析器在解析function关键字的时候,会将相应的代码解析成function表达式,而不是function声明。

 

(function(a){
    console.log(a);   //123
})(123);   //后面括号里传入了函数执行的参数。若是这个参数是外部的变量,将会造成闭包。这个变量也会保存在这个函数中。

 

 

3、模块

  提到当即执行函数,总会想到模块,由于模块一般用当即执行函数的方式去建立。

  一个模块能够包括:私有变量、私有方法、公有变量、公有方法。

(function() {
    // 私有变量
    var age = 20;
    var name = 'Tom';


    // 私有方法
    function getName() {
        return `your name is ` + name;
    }


    // 公有方法
    function getAge() {
        return age;
    }

    // 将公有方法引用保存在外部执行环境的变量中,造成闭包,防止该执行环境被垃圾回收
    window.getAge = getAge;
})();
相关文章
相关标签/搜索