博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS进阶之---函数,立即执行函数
阅读量:6251 次
发布时间:2019-06-22

本文共 2142 字,大约阅读时间需要 7 分钟。

 

一、函数

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

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

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

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

 

  调用时的区别

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

 

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

  我们知道,函数的参数在进入函数后,实际是被保存在了函数的变量对象中,因此,这个时候相当于发生了一次复制。

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

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

 

 

二、立即执行函数

  两种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);   //后面括号里传入了函数执行的参数。如果这个参数是外部的变量,将会形成闭包。这个变量也会保存在这个函数中。

 

 

三、模块

  提到立即执行函数,总会想到模块,因为模块通常用立即执行函数的方式去创建。

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

(function() {    // 私有变量    var age = 20;    var name = 'Tom';    // 私有方法    function getName() {        return `your name is ` + name;    }    // 公有方法    function getAge() {        return age;    }    // 将公有方法引用保存在外部执行环境的变量中,形成闭包,防止该执行环境被垃圾回收    window.getAge = getAge;})();

 

 

 

  

转载于:https://www.cnblogs.com/lishuxue/p/6588234.html

你可能感兴趣的文章
如何编写可移植的c/c++代码
查看>>
#pragma pack(n)
查看>>
IntelliJ IDEA 2018.3 升级功能介绍
查看>>
基于.NET平台常用的框架整理
查看>>
【每天一道算法题】Lucky String
查看>>
整合apache+tomcat+keepalived实现高可用tomcat集群
查看>>
计算几何-HPI
查看>>
香农熵学习+例子[转载]
查看>>
利用DE2上的WM8731D/A转换器产生正弦波
查看>>
清除EasyUi combotree下拉树的值
查看>>
手写RPC框架
查看>>
Hadoop 分片、分组与排序
查看>>
使用Windows8开发Metro风格应用一
查看>>
android尺子的自定义view——RulerView
查看>>
将博客搬至CSDN
查看>>
leetcode43
查看>>
直接在安装了redis的Linux机器上操作redis数据存储类型--set类型
查看>>
016——数组(十六)usort uasort uksort
查看>>
PyQt5+requests实现车票查询工具
查看>>
文件下载界面
查看>>