文档章节

js对立即执行函数的理解

码上有春天
 码上有春天
发布于 2015/11/18 11:35
字数 578
阅读 19
收藏 0

js函数的两个概念:函数声明、函数表达式

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

函数表达式 var fnName = function () {…};使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。匿名函数也属于函数声明。

函数声明和函数表达式不同之处在于:

一、Javascript引擎在解析javascript代码时会有‘函数声明提升’(Function declaration Hoisting),函数表达式不会。

二、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以fnName()形式调用 。所以,要在函数体后面加括号就能立即调用,则这个函数必须是函数表达式,不能是函数声明(因此也不能使匿名函数形式)

(function(a){
    console.log(a);   //firebug输出123,使用()运算符
})(123);
  
(function(a){
    console.log(a);   //firebug输出1234,使用()运算符
}(1234));
  
!function(a){
    console.log(a);   //firebug输出12345,使用!运算符
}(12345);
  
+function(a){
    console.log(a);   //firebug输出123456,使用+运算符
}(123456);
  
-function(a){
    console.log(a);   //firebug输出1234567,使用-运算符
}(1234567);
  
var fn=function(a){
    console.log(a);   //firebug输出12345678,使用=运算符
}(12345678)

()、!、+、-、=等运算符,都可以将函数声明转换成函数表达式,消除javascript引擎识别函数表达式和函数声明的歧义,告诉javascript引擎这是一个函数表达式,不是函数声明,可以在后面加括号,并立即执行函数的代码。 加括号是最安全的做法,因为!、+、-等运算符还会和函数的返回值进行运算,有时造成不必要的麻烦。

这样写的用处在于:由于javascript中没用私有作用域的概念,但可以通过函数作用域链的特性模仿一个私有作用域,在该作用域内可以访问外部的变量,但不能从外部访问这个作用域内部的变量,从而避免对全局变量的污染。俗称“匿名包裹器”或“命名空间”

© 著作权归作者所有

码上有春天
粉丝 5
博文 82
码字总数 55985
作品 0
广州
程序员
私信 提问
JavaScript的计时器的工作原理

最近都在看一些JavaScript原理层面的文章,恰巧看到了jQuery的作者的一篇关于JavaScript计时器原理的解析,于是诚惶诚恐地决定把原文翻译成中文,一来是为了和大家分享,二来是为了加深自己对...

第三方支付接口
2014/11/30
59
0
浅谈var、let、闭包以及立即执行函数(namespace)

首先我们来看个常见的例子 上述答案有同学可能回答 6和12345,那么就大错特错了 分析:上述例子其实是一样的 不管有没有存在异步函数(这里的setTimeout就是异步函数),例子一我执行a6和例子...

vnues
06/25
0
0
JavaScript中timer是如何工作的

作为入门者来说,了解JavaScript中timer的工作方式是很重要的。通常它们的表现行为并不是那么地直观,这是因为它们都处在单线程中。让我们先来看看三个用来出创建和操作timer的函数。 var id...

Seven_7
2014/08/06
140
0
[译] 揭开 JavaScript 引擎的面纱——深入审视当下最流行的开发语言

原文链接:JavaScript: Under the Hood 前言 最初,JavaScript 只能在 Web 浏览器中运行,但是随着 Node 的出现,现在 JavaScript 也可以在服务端运行。虽然我们可能知道应该在何时何地去使用...

梁天培_Tim
09/29
0
0
js中(function(){…})()立即执行函数写法理解(经过控制台测试后修改)

( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,...

文文1
2015/06/19
24.7K
17

没有更多内容

加载失败,请刷新页面

加载更多

CentOS 7 查找软件安装位置的方法

1、通过文件搜索查找 root@jun-virtual-machine:# find / -name "*squid*"/var/log/squid/var/spool/squid/var/lib/yum/yumdb/s/48a7dbee62d6d5962ed739a8e4fc117cf7378bfd-squid-3.5......

webcreazy
8分钟前
2
0
eureka 加入密码认证 springboot-admin 加入密码认证

1. pom.xml 加入依赖 <!-- 加入密码认证 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</ar......

java框架开发者
12分钟前
3
0
数字在排序数组中出现的次数

Input:nums = 1, 2, 3, 3, 3, 3, 4, 6K = 3Output:4 二分查找的练习 public int GetNumberOfK(int[] nums, int K) { int first = binarySearch(nums, K); int last = b......

Garphy
24分钟前
4
0
大厂面试经:高频率JVM面试问题整理!

JVM(Java虚拟机)简单来说就是运行Java代码的解释器,作为螺丝钉程序员JVM其实了解下就差不多啦,不懂JVM内部细节照样能写出优质的代码!但是一到造火箭、飞机的场景(面试)不懂JVM的你,会...

架构文摘
39分钟前
9
0
thinkphp5.1学习过程五——request

<?phpnamespace app\index\controller;//use \think\facade\Request;use \think\Request;/** * Class Demo3 * @package app\index\controller * 正常情况下,控制器不依赖......

大海yht
49分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部