什么是js中没有块级作用域域.js为什么没有呢

JS中没有块级作用域和局部变量的一个问题? - 知乎16被浏览1931分享邀请回答if (true){
  function(){
  var color="blue"
//以上代码希望根据条件创建function,但是js没有块级作用域
//function函数声明提升和if语句冲突,属于无效语法
//js有函数作用域,color是function的私有成员,函数外部无法访问内部变量
alert(color);//错误,color不存在
js有两种定义函数的方式,一种是函数声明,另一种是函数表达式//函数声明
function functionName (arg0,arg1,arg2){
//函数表达式
var functionName = function (arg0,arg1,arg2){
js编译器有函数声明提升,所以任意直接以function开头的函数,会最先被放置到全局环境,在if执行之前,函数声明就已经被读取了。函数表达式就像是常规的变量赋值,这种情况下创建的叫做匿名函数,因为function关键字后面没有标识符。函数表达式的执行逻辑就和常规表达式相同,只有执行到赋值,函数才会存在,下例将导致错误。sayHi() //错误:函数还不存在
var sayHi = function (){
alert('hi')
再看一个例子下if (condition) {
function sayHi(){
alert('hi')
function sayHi(){
alert('yo')
以上代码在ECMAScript中属于无效语法,javaScript引擎会尝试修正错误,但是问题是浏览器尝试修正错误的方式不一致,大多数浏览器会返回第二个声明,忽略condition,因此这种方式不应该出现在你的代码中。不过,如果用函数表达式就不会有问题。// 可以这样做
if (condition) {
sayHi = function (){
alert('hi')
sayHi = function (){
alert('yo')
这个例子不会有什么意外,不同函数会根据condition赋值给sayHi3添加评论分享收藏感谢收起2添加评论分享收藏感谢收起查看更多回答拒绝访问 | .cn | 百度云加速
请打开cookies.
此网站 (.cn) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(38ba45c4a33843ad-ua98).
重新安装浏览器,或使用别的浏览器JavaScript匿名函数之模仿块级作用域
作者:tianxintian22
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了JavaScript匿名函数之模仿块级作用域的相关资料,需要的朋友可以参考下
函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。
匿名函数:就是没有函数名的函数。
函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式
第一种:这也是最常规的一种
function double(x){
return 2 *
&第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用。
var double = new Function('x', 'return 2 *');
var double = function(x) { return 2* }
&注意“=”右边的函数就是一个匿名函数,创造完毕函数后,又将该函数赋给了变量square。
JavaScript中是没有块级作用域概念的。也就是说,在块级语句中定义的变量,实际上是在包含函数中(外部函数)而非语句中创建的。
function outputNumber(count){
for(var i=0;i&1000;i++){
该函数在java、C#等语言中,变量i只会在for循环语句中有定义,循环结束,i也就被销毁了。但在JavaScript中,变量i是定义在outputNumber()活动对象中的,因此在它定义开始,就可以在函数内部访问它。即使重新声明同一个变量,也不会改变它的值。
function outputNumber(count){
for(var i=0;i&1000;i++){
//重新声明变量
匿名函数可以用来模仿块级作用域并避免这个问题,用作块级作用域(也称私有作用域)的匿名函数的语法如下:
(function(){
//这是块级作用域
以上代码定义变调用了一个匿名函数,将函数声明包含在一个小括号里面,表示它是个函数表达式。紧跟其后的另一对小括号会立即调用这个函数。
无论什么时候,只要临时需要一些变量,就可以用私用作用域,例如:
function outputNumber(count){
(function(){
for(var i=0;i&1000;i++){
//导致一个错误
这样,我们在for循环外部插入了一个私有作用域。在匿名函数中定义的任何变量,都会在执行结束时被销毁。
这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。
一般来说,我们应该尽量减少向全局作用域中添加变量和函数。
这种做法可以减少闭包占用内存的问题,因为没有指向匿名函数的引用,只要函数执行完毕,就可以立即销毁其作用域链。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域)。而在javascript中则没有块级作用域,首先来看一段代码:
function test(){
for(var i = 1 ; i &=5; i++){
对于有块级作用域的语言来说,for语句中定义并初始化的变量i在循环外是无法访问的,而在javascript中,for语句中定义的变量i在循环结束后,依旧会存在于循环外部的执行环境(作用域)中,在这里i的作用域是全局环境。具体来说就是:使用var关键字声明变量时,这个变量会自动添加到距离最近的可用环境中。对于函数而言,这个最近的环境就是函数的局部环境。如果变量在未经声明的情况下被初始化,则该变量会被自动添加到全局环境。
不过有时候的确很需要块级作用域来解决一些问题,这时候我们就可以使用匿名函数来模仿块级作用域。
匿名函数就是没有名字的函数,有时候也被称为拉姆达(lamda)函数。形式如下:
function functionName(arg0,arg1){
而用作模仿块级作用域(私有作用域)的匿名函数的语法形式如下:
(function(){
//块级作用域
以上代码的意思是:首先定义并立即调用一个匿名函数。将函数声明包含在圆括号中,表示它实际上是一个函数表达式。而紧随其后的另一对圆括号表示立即调用这个函数。
可能刚开始我们感觉这种语法比较难以理解,我们可以先看下下面这段代码:
var myFunc=function(){
alert(‘函数’);
上面的代码中,首先以函数表达式的方式定义了一个函数,然后立即调用它。在这里定义函数的方式就是先创建一个匿名函数,然后将其赋值给变量myFunc,而在函数名称后加一对圆括号即表示调用函数。那我们如果直接用匿名函数代表变量myFunc,在匿名函数后面添加一对圆括号不就表示直接调用了吗?然而,如果如下这样做就会报错:
function(){
因为在javascript中,function关键字表示一个函数声明的开始,而函数声明后面不能直接跟圆括号。而函数表达式后面可以跟圆括号,来表示函数调用。在函数声明外面加一对圆括号就可以转换成函数表达式,如下:
(function(){
//块级作用域
这样最简单的块级作用域就创建好了。这种技术长在全局作用域中用在函数外部,来限制向全局作用域中添加过多的变量和函数。例如:
(function(){
var now=new Date()
if(now.getMonth()==0&&now.getDate()==1){
alert(“Happy new year”)
以上代码放在全局作用域中,用来确定在1月1日显示一条祝贺新年的信息。其中变量now现在就是匿名函数模仿的块级作用域中的局部变量。
当然,只要我们临时需要一些变量,都可以使用块级作用域(私有作用域)。当匿名函数执行完毕,其作用域链立即销毁,从而可以减少闭包占用资源问题。
// js : () 表示执行
function test(){
(function(){
for(var i = 1 ; i &=5; i++){
//(function(){alert('我直接执行了!');})();
版权声明:本文为小平果原创文章,转载请注明:http://blog.csdn.net/i
阅读(...) 评论()

我要回帖

更多关于 js块级作用域 的文章

 

随机推荐