JS变量为什么使用前面要申明

   只要是写过点JS代码,很简单一个var 就完事了。那对于JS编译器背后它又发生了什么呢?那就一步步通过代码来讲起。

  View Code?

  x = 1;

  alert(x);

  var y = function() {

  alert(x);

  var x = 2;

  alert(x);

  }

  y();

  上面的代码也会你答对了它会分别输出:1,undefined,2。对于我来说,第一反应它会输出:1,1,2。为什么第二个会输出undefined?在上面我明确定义了一个全局变量x,为何找不到?

  那是因为:js编译器在执行这个y函数的时候,会把把它body里面的声明变量提前到最前面进行声明。比如:var x=2; 编译器先会在body最前面进行var x 声明。其实上面的代码等同于下面的这段代码:

  ?

  x = 1;

  alert(x);

  var y = function() {

  var x;//此时x还未赋值,所以为undefined。

  alert(x);

  x = 2;

  alert(x);

  }

  y();

  所以也就不难理解x=undefined的了.但是如果把var x = 2;这段代码给删掉,在内部它没有进行var声明。它会一直沿着作用域向上找,此时的x 就为全局x.

  接下来再看一个更有趣的例子。

  ?

  var a = 1;

  function b() {

  a = 10;

  ?

  return;

  ?

  }

  b();

  alert(a);

  ///////////////////////////////////

  ?

  var a = 1;

  function b() {

  a = 10;

  ?

  return;

  ?

  function a() {}

  ?

  } b(); alert(a);

  例子很简单。第一个例子为输出10,第二个会输出1。这是为什么呢?况且第二个例子我都return 了。按理都应当输出10才对呀!那时因为JS编译器在背后作怪。

  两段代码差别就是第二个例子多了个function a(){};便这个函数体里面什么也没有,并且也没有对它进行任何调用。

  其实JS编译器在背后会把function a() {}编译成 var a=function (){}。此时对于函数内部也有一个a=10; 外面的a些也还是1;根据JS作用域。会先找内部的a,如果找不到再向上一级一级找。

  最张alert(a) 就会显示1;

时间: 2024-10-31 10:32:43

JS变量为什么使用前面要申明的相关文章

js变量以及其作用域详解

一.变量的类型  Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量.例如: i=100;//Number类型  i="variable";//String类型  i={x:4};//Object类型  i=[1,2,3];//Array类型 JS的这种特性虽然让我们的编码更加灵活,但也带来了一个弊端,不利于Debug,编译器的弱检测让我们维护冗长的代码时相当痛苦

js变量以及其作用域详解_javascript技巧

一.变量的类型 Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量.例如: 复制代码 代码如下: i=100;//Number类型 i="variable";//String类型 i={x:4};//Object类型 i=[1,2,3];//Array类型 JS的这种特性虽然让我们的编码更加灵活,但也带来了一个弊端,不利于Debug,编译器的弱检测让我们维护冗长的

js变量初探

js是一种无类型弱检测的语言,它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式就可以将各种类型的数据赋值给同一个变量:而且js中的变量是松散类型的,可以存储任何类型的数据:由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变 变量命名方法与规则: 1.变量的命名方法 (1)匈牙利命名法:变量名=类型+对象描述,变量的类型有:Int(整形).Float(浮点形).Boolean(布尔形).String(字符串).Array(数组).Obje

js变量作用域及可访问性的探讨

js|变量|访问 每一种语言都有变量的概念,变量是用来存储信息的一个元素.比如下面这个函数:  1function Student(name,age,from) 2{ 3 this.name = name; 4 this.age = age; 5 this.from = from; 6 this.ToString = function() 7 { 8  return "my information is name: "+this.name+",age : "+thi

twig里使用js变量的方法_php实例

本文实例讲述了twig里使用js变量的方法的方法.分享给大家供大家参考,具体如下: 先看一段代码 <script type="text/javascript"> jQuery(document).ready(function(){ jQuery(#my_input).change(function(){ var value = jQuery(#my_input).val(); jQuery.ajax({ url: {{ path('ParteAccidentes_ajax'

javascript-Android WebView中子窗口iframe的js方法无法获取父窗口window中的js变量?

问题描述 Android WebView中子窗口iframe的js方法无法获取父窗口window中的js变量? 如题,今天写了一个Html页面,包含Js方法若干,其中包括建立全局的js变量.即window.var 另外,Html中包含一个iframe子窗体,子窗体中的Js方法需要调用父窗体Js方法中所建立的那个全局变量 用PC端的浏览器打开主页,iframe可以获取到父窗体中的JS变量,但是用android的WebView打开这个Html页面,却始终无法获取到 尝试了很多种方式都不行,既然PC端

el表达式取js变量获取不到

问题描述 el表达式取js变量获取不到 var selected = "${requestScope.list[i].supplierid}"; var j = ${fn:length(list)}; for(var i=0;i<j;i++){ alert(selected); } ${requestScope.list[i].supplierid} 用js变量i循环取不到值 解决方案 var selected = "${requestScope.list[i].sup

js变量怎样加入超链接

问题描述 js变量怎样加入超链接 解决方案 解决方案二:js里也可以写html格式的啊或者写到div里解决方案三:路过--解决方案四:如加入到<divid="test"><div>document.getEl...byID(TEST).inerHTML="<div><ahref'=xxxxxxxx'"+"js变量的值"+"></a></div>" 英语不好

js变量、作用域及内存详解_基础知识

基本类型值有:undefined,NUll,Boolean,Number和String,这些类型分别在内存中占有固定的大小空间,他们的值保存在栈空间,我们通过按值来访问的. (1)值类型:数值.布尔值.null.undefined. (2)引用类型:对象.数组.函数. 如果赋值的是引用类型的值,则必须在堆内存中为这个值分配空间.由于这种值的大小不固定(对象有很多属性和方法),因此不能把他们保存到栈内存中.但内存地址大小是固定的,因此可以将内存地址保存在栈内存中. <script type="