51.函数与作用域& 立即函数表达式
程序员文章站
2022-07-11 11:53:20
...
注意:变量声明和函数声明都会提升,函数声明提升的优先级高于变量声明提升。
示例:
console.log(a);
var a=1;
function a(){};
如下代码的输出是?为什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name); //hello world,因为sayName函数声明提升
}
var sayAge = function(age){
console.log(age); //抛出TypeError: sayAge is not a function,因为sayAge是函数表达式,使用前必须赋值,而声明放在了调用的后面,此时函数还不存在,所以会报错
};
以下是错误做法
//函数调用
sayHi();
//函数声明
var sayHi = function(){
console.log('Hi!');
};
会抛出错误:函数还不存在
立即执行函数表达式是什么?有什么作用
- 立即执行函数表达式:
缩写IIFE,是一种利用javascript函数生成新作用域的编程方法,也叫自执行函数。 - 作用:
- 令函数中声明的变量绕过js的变量置顶声明规则
- 避免新的变量被解释成全局变量或函数名占用全局变量名的情况
- 在禁止访问函数內变量声明的情况下允许外部对函数的调用
- 实现:因js里的()里不能包含语句,所以解析器会将()里的代码解析成function表达式并立即执行。
// 以下都能实现立即执行
(function(){ /* code */ }());
(function(){ /* code */ })();
// function前加一元运算符也可实现,advance-task2我有提到过
!function () { /* code */ } ();
~function () { /* code */ } ();
-function () { /* code */ } ();
+function () { /* code */ } ();
写法
-
第一种:
-
第二种:
作用:
- 进行作用域的隔离。因为在js中,没有块级作用域的概念,一个函数代表一个作用域。所以用来隔离作用域避免污染,或者截断作用域链,避免闭包造成引用变量无法释放。
作者:_Dot大师兄
链接:https://www.jianshu.com/p/ac38114b6e24
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:_Dot大师兄
链接:https://www.jianshu.com/p/ac38114b6e24
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
上一篇: 一个例子理解函数声明与函数表达式的区别
下一篇: 灰度图像直方图均衡化公式及实现