函数表达式模仿块级作用域

一   块级作用域:javascript没有块级作用域


什么是块级作用域:举例说明

function outPutNumber(count){
   for(var i=0;i<count;i++){
       alert(i);

}

alert(i);
}
这个个函数中定义了一个for循环,如果实在java,c 等有块级作用域的语言中当变量i出了这个循环,循环一旦结束变量i也就立马会被销毁内存被释放,但是javascript是没有块级作用域的,所以变量i是在outPutNumber()这个函数的活动对象中的,因此从他有定义开始在这个函数内部就死随时可以访问这个变量的。
function outPutNumber(count){
   for(var i=0;i<count;i++){
       alert(i);

}
var i;//var i=2;
alert(i);
}
outPutNumber(5);

javascript从来不会告诉你是不是多是生命了同一个变量,遇到这情况,他就会对后面的声明视而不见(若初始化了就会继续执行)

匿名函数可以避免这个问题,

下面是避免这个问题的方法:


(function (){//这里是块级作用域})();

理解为什么这样做:

var someFunction=function(){//这里是块级作用域};//定义了一个匿名函数并将匿名函数赋予变量someFunction

soomeFunction();//调用匿名函数通过变量后面加()

那么以上代码就等于下面

function (){}();//但是这样会爆出错误,因为function关键字表示的是函数声明而函数声明后面不能跟()

(function (){//这里是块级作用域})()//将前面那个函数加上括号就表示是函数表达式,而函数表达式后面是可以跟()的

function outPutNumber(count){
 (function(){  for(var i=0;i<count;i++){
       alert(i);

}
})();//这样就创建了一个块级作用域当这个循环执行完毕里面的变量就会销毁外面的访问不到

alert(i);//这里现在会抛出一个错误,因为没有定义i
}
outPutNumber(5);


其实块级作用域就是运用了闭包函数,作用域链,作用域,变量对象

内部函数能访问外部函数的作用域,而外部函数则不能访问内部函数的作用域
### JavaScript 中函数作用域与块级作用域 #### 函数作用域特性 在JavaScript中,当变量被定义在一个函数内时,则该变量具有函数作用域。这意味着此变量仅能在其所在的函数内部访问,在外部则无法获取到这个变量的信息[^1]。 ```javascript function exampleFunction() { var functionScopedVariable = "I'm scoped to this function"; console.log(functionScopedVariable); // 输出: I'm scoped to this function } console.log(functionScopedVariable); // 抛出错误, 变量未定义 exampleFunction(); ``` #### 块级作用域特性 自ES6起引入了`let`和`const`关键字用于创建拥有块级作用域的变量。这种类型的变量只存在于由花括号界定的一段代码之内——比如if语句或for循环体内;一旦离开这段区域就不再可见[^5]。 ```javascript { let blockScopedVariable = 'I exist only within these curly braces'; const alsoBlockScoped = true; } // 尝试在此处打印上述两个变量会抛错,因为已经超出了它们的作用域边界 ``` #### 主要区别 - **生命周期**: 对于使用`var`声明的变量来说,即使是在条件判断或者循环结构里初始化,仍然会在整个封闭函数范围内有效甚至在整个文件(如果是顶层)下都存在。而采用`let`/`const`的方式能够更精确控制变量的存在周期,限制在特定的代码区之中。 - **重复声明处理**: 如果尝试在同一作用域多次声明同一个名字的`var`型变量是可以接受的行为,但是这样做对于`let`和`const`就会引发语法错误,除非这些声明位于不同的嵌套层次上[^4]。 #### 实际应用案例对比 下面的例子展示了两种不同方式下的行为差异: ```javascript // 函数作用域例子 for (var i = 0; i < 3; i++) {} console.log(i); // 输出: 3 // 块级作用域例子 for (let j = 0; j < 3; j++) {} console.log(j); // ReferenceError: j is not defined ``` 在这个简单的迭代过程中可以看到,由于`i`是通过`var`声明并处于函数别作用域之下,所以在循环结束后依旧可以在外面找到它;相反的是,利用`let`建立起来的`j`遵循着严格的规则,因此超出它的限定范围之后便不可再触及。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值