第十七节:JS中的作用域

回顾

在JS中作用域是基于函数创建的,es6之后出现了块语句作用域;作用域可以相互嵌套,但不可重叠
作用域:对数据存取得规则称之为作用域
函数作用域:每创建一个函数,就创建了一个作用域,被作用域包裹的变量或者函数,函数体外是访问不到的;对内部而言,这个变量或者函数称之为私有变量和私有函数;对外部而言,该变量和函数是被隐藏的。

var a=2;
function sum(){
var a=5;
console.log('函数体中a',a);
return a+2;
}
console.log(a);//2
sum();//函数体中a 5    7

匿名函数自执行 写法,将函数声明语句变成函数表达式语句,使其符合规范,即可解决报错
IIFE( 立即调用函数表达式)是一个在定义时就会立即执行的 JavaScript 函数

//方法一
var a=function (){
console.log('匿名函数');
}()
//方法二
(function(){
console.log('匿名函数');
})()
//方法三(!逻辑运算符)
!function(){
console.log('匿名函数');
}()
//其他方法
+function(){
console.log('匿名函数');
}()
-function(){
console.log('匿名函数');
}()
~function(){
console.log('匿名函数');
}()
true&&function(){
console.log('匿名函数');
}()
false||function(){
console.log('匿名函数');
}()

关于以上几种方法性能问题,大部分性能都差不错,但一元操作符性能稍微偏低一点(一元加+,一元减-,位操作符~)
函数自执行这种方法好处和作用:

  • 避免作用域下的命名污染
  • 对整个程序的性能有提升(因为减少了对作用域的查找)
  • 有利于压缩(例如你可以把document、windows这些比较长的名称作为实参,用比较简单的形参来代替这些比较长的名称)
  • 能避免全局命名的冲突,或者填坑
  • 保存闭包状态(例如for循环中使用异步操作,可以将循环的i作为实参传递给自执行函数)
  • 可以颠倒代码的运行顺序
//关于压缩
!function(doc,win){
console.log(doc,win.name);
}(document,window)
//全局命名冲突,例如你的框架需要使用$符号,为了避免与jQuery冲突
!function(JQ){
console.log(JQ);
}(window.jQuery)
//填坑
//如果之前代码有人定义undefined = true;采用这种自执行函数的方法可以避免使用undefined出现错乱,把没有传的东西定义为undefined
!function(undefined){
 //自执行函数中代码
}()
//自执行函数颠倒顺序,为自执行函数传入一个函数参数
function a(){
console.log('a');
}
!function(){
console.log('自执行函数');
}(a())
//先执行a()函数,然后再执行自执行函数内的内容

备注:关于闭包后续详解
如果使用小括号,建议在小括号前面使用分号,避免出现不必要的合并压缩报错

//例如之前的变量没有加分号,后面跟自执行函数,就会出错
var a='c'
(function(){
console.log('自执行函数');
})()
//合并代码有可能就会变成下面写法,可能会报错,所以建议自执行函数使用小括号时加上分号
var a='c'(function(){})()
//建议写法
var a='c'
;(function(){
console.log('自执行函数');
})()

备注:本内容学习总结来源于喜马拉雅冰山工作室沙翼老师主讲的(陪你读书(JavaScript WEB前端))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值