js代码嵌套问题,为什么外层定义的变量内层不能使用

作者&投稿:丘贩 (若有异议请与网页底部的电邮联系)
javascript 为什么我将变量定义在函数外,函数内就无法正常使用这两个变量.~

把你的
这段代码放到的后面

你好!Chrome/Firefox/Safari下的console工具栏测试都是undefined哦

是这样的,在js的解释器(编译机制)里的规则是这样的

在作用域中的变量声明和方法声明都会呗编译器在编译的时候,

给强制挪到第一行,在开始执行,并且变量的默认值都是 `undefined`

比如:

(function(){
  //这是一个独立作用域
  var i = 0;
  var a = 1;
  alert(i + a);
})();

经过编译后的代码可能会类似这样

(function(){
  var i , a;//变量的声明会挪到首行,并且变量默认赋值为`undefined`
  i = 0;
  a = 1;
  alert(i + a);
})();

也会有这种情况

(function(){
  alert(a);
  test();
  var a = 1;
  function test(){
    alert('test fn');
  }
})();

编译后的代码:

(function(){
  var a;
  function test(){//方法会直接挪到代码前
    alert('test fn');
  }
  alert(a);
  test();
  a = 1;
})();

所以你会发现,定义的方法,在代码的任何位置都可以调用,就是这个原因,因为编译后的代码,不管你的方法定义在那里,都会帮你挪到首行


另外,你那里的变量,作用域的问题的规则是这样的

如果同名的变量,那么局部作用域的变量优先于外部变量

var a = 1; //这是一个外部定义的变量
(function(){
  alert(a);
  var a = 2;//在这里,又使用`var`声明了一次 `a`,
            //那么这个变量就会覆盖在外面定义的变量`a`
})();

编译后的结果将是这样

var a;
a = 1;
(function(){
  var a;//这里的a就会覆盖外面的变量a,并且编译器会默认赋值undefined
  alert(a);//所以这里就会弹出undefined了
  a = 1;
})();


当人,如果内部没有用`var`声明这个变量,那么外部作用域和内部的作用域就会使用同一个变量

比如这样

var a = 1;
(function(){
  alert(a);//这样这个方法在自己的作用域中无法找到变量`a`,就会去父作用域找变量`a`
           //如果还没找到,就在往父作用域中找,这样直到找到为止
           //或者一直找到global(全局作用域)还没找到变量`a`,
           //就会抛出一个异常(也就是报错) 'ReferenceError : `a` is not defined'
})();


f1和f2是局部函数,与a = 1不在一个作用域;
f3与a = 3在同一作用域。


scrollview嵌套listview为什么显示不全
方法3的优点是完全解决了ScrollView嵌套ListView的问题,同时代码较少,你甚至可以直接使用LinearLayout,而在Activity中手动为LinearLayout添加子项控件,不过需要注意的是,在添加前需要调用其removeAllViews的方法,否则可能会出现预想不到的事情,那时你会想念天国的ListView的。缺点不是很明显,但还是有两个:一是使用的不是...

关于C中do while 和switch嵌套后的问题
include<stdio.h>int main (void){ char choice ; printf("Are you filing a single , joint,or"); printf("married return (s,j ,m)?"); do { scanf("%c",&choice); \/\/这里用的是scanf switch(choice) {case ('s'): printf("aaaaaaaa\\n");break; case ('j...

一个matlab里的排列组合或者说是循环嵌套的层数不定的问题,如何...
基本思路 1、使用ndgrid生成N维网格数据;2、把网格数据转换为坐标组合。参考代码 把每维的坐标写成向量,然后放在一个cell数组中% 这里按照你给的例子示范(三个坐标)C = { 3:4 3:4 3:4 };% 使用ndgrid生成N维网格数据n = length(C);S=arrayfun(@(i)sprintf('x%i ',i),1:3,'Uniform...

vb.net中嵌套结构体传值复制的问题
因为数组是引用类型,所以直接赋值会出现这种情况 可以在kb=k后单独复制数组 kb.rr=k.rr.Clone 这样两个数组就是独立的了 之所以先kb=k是为了当其含有多个成员时值型成员可以直接复制,只需Clone引用类型的就行了

matlab里面的for循环嵌套
这是matlab里面的for循环嵌套if的用法。举例说明具体的使用方法,详解如下:1、首先,创建一个新的子程序loopcolor,如下图所示。2、其次,完成上述步骤后,定义几个变量,所有变量都是整数类型,代码如下图红框所示。3、接着,完成上述步骤后,为mycolor分配一个值, mycolor = 0,如下图所示。4...

do_while 嵌套if -else怎么使用我的代码有问题么?
多了一段else,删掉就OK了,书写的时候注意格式和递进,一个if对应一个else

CSS的SASS样式应该怎么使用
}这样做能够使开发者一眼看出@extend(s)和@include(s)的部署,便于自己以及其他开发者对代码的解读。你可能还会对是否区分自定义的@includes和公共来源的@includes在有些情况下做出决定(尤其是考虑到代码的可重用性和时效性)选择器嵌套.weather { @extends %module; background: LightCyan; @include transition(...

为了写好代码,你坚持了哪些好习惯?
模块化编程 将代码模块化,提取出公共逻辑可以使代码的结构比较清晰,对于出现bug时,bug定位起来也比较方便。在代码中嵌套是我们经常做的事情,虽然嵌套本身并没有什么问题,但有时会使代码更难读。为了避免不必要的嵌套,我们可以使用 "Return Early "设计模式,它允许我们将if语句作为一个保护子句,在...

SQL。。server级触发器代码问题。。高手》》
SQL。。server级触发器代码问题。。高手》》 createtriggerddl_trig_loginonallserver这里的allserver指的范围是什么?包括网络上的SERVER吗?... create ...若要禁用嵌套触发器,请用 sp_configure 将 nested triggers 选项设置为 0(关闭)。默认配置允许嵌套触发器。如果嵌套触发器是关闭的,则也将禁用递归触发器...

关于WORD域嵌套的问题
= 然后有两种方式:1. 继续按Ctrl+F9在域中再插入一个域,光标定位到新插入的域中,输入:page 显示为:{ ={ page} } 光标跳出内层域,在内层域的右侧输入:+200 显示为:{ ={ page} +200 } 2. 直接插入页码,再输入:+200 无论哪种方式都行,切换域代码后,在第1页得到:201 ...

运城市15222142550: js代码嵌套问题,为什么外层定义的变量内层不能使用 -
轩许抚弘: 是这样的,在js的解释器(编译机制)里的规则是这样的<br>在作用域中的变量声明和方法声明都会呗编译器在编译的时候,<br>给强制挪到第一行,在开始执行,并且变量的默认值都是 `undefined`<br><br>比如:<br>(function(){<br> //这是一...

运城市15222142550: JS单引号嵌套的问题,怎么改才能对呢! -
轩许抚弘: js单引号要配对.嵌套的时候,不管多少层,最外层才是字符串意义的单引号,内层都是字符单引号,需要转义(\).举例:var s1='aaaa';//正确,这是一个常见的字符串,外侧用单引号括起来.var s2='aaa\'aaa';//正确,这里内部有一个单引...

运城市15222142550: js中,for循环嵌套,在里层for循环内的click函数内获取外层for循环变量时返回值不正确. -
轩许抚弘: 这个问题我测试了一下我先定义一个变量var g=0; 设置加载即运行,程序是有一个for循环,里面有一个鼠标事件函数,鼠标事件函数内也有个循环 然后把 console.log(g++); 这条语句放在三个地方,一个地方是for循环的大括号里,鼠标事件...

运城市15222142550: “如果嵌套的分程序有同名变量 内层变量阻塞对外层变量的访问”这句话怎么理解 举例说明 -
轩许抚弘: 这句话的意思,就是“县官不如现管”,如果外层有一个变量x,内层也有一个变量x,当内层的程序调用变量x时,内层的就优先.当然此时被访问的x变量必须是确定的一个,所以外层的变量x就被“屏蔽”了(即被“阻塞”了).

运城市15222142550: javascript代码单引号双引号嵌套问题 -
轩许抚弘: 可以:return ''.$this->pageNum.')?'.$this->pageNum.':this.value; location=\\\" '.$this->uri.'page/\'+page+\' \\\"}">'; \\\"中 \\这样会生成一个\,这个是给js的,\"会生成一个",合起来就是个\"在js中再转义就是".

运城市15222142550: 关于JS中function onclick()嵌套的问题 -
轩许抚弘: // 因为按钮时动态生成的,所以需要使用live方法绑定click事件$('#btn' + k).live("click", function(){ // 这里是事件的处理 });

运城市15222142550: javascript 多层嵌套try catch问题 -
轩许抚弘: 看看下面的代码:完全可以执行啊!if (window.XMLHttpRequest) { //Mozilla 浏览器 XMLHttpReq = new XMLHttpRequest(); } else { if (window.ActiveXObject) { // IE浏览器 try { XMLHttpReq = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) ...

运城市15222142550: JAVA运行出现问题 什么嵌套类型无法隐藏外层类型,大神们我该怎么办…求救…急急急 -
轩许抚弘: 定义在其他类内部的类不可以是public,只有顶层类可以是public.

运城市15222142550: javascript中for嵌套循环怎么理解!
轩许抚弘: 你可以只一层循环,但是循环体要放到{}里才行.for (j = n; j > 0; j--) { self.moveBy(j,0); self.moveBy(-j,0);} 否则只是循环右移n次后,左移一次. 双重循环不过是把n次变成10 * n次,你直接1个循环10 * n次也一样.

运城市15222142550: PASCAL作用域那的一点问题. 什么是外层过程?什么是嵌套过程? -
轩许抚弘: 就是局部变量在局部优先、全局变量是全局优先的. 如果你在外面定义一个i,里面定义一个i,在里面的时候里面的i优先、但是出来之后里面的i的值不能传给外面的i

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网