Javascript var变量隐式声明方法

诸如此类。这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误,这个变量被写成y了,结果相当于“隐式”声明了一个变量y,在实际编程过程中,这种错误有时比较难以发现。
除此之外,今天通过同事介绍,了解到这种“隐式声明”中的别外一个问题。
当你在当前上下文内进行这种“隐式”声明时,JavaScript引擎会先在当前上下文中寻找是否之前有声明此变量,如果没有,再到上一级的上下文中去寻找,如果一直未找到,会最后在window上声明这个变量!
比如:


代码如下:

window. y = "hello";
function func(){
y = "OH, NO!!!";
}
func();
alert(window.y); //#=> display "OH, NO!!!"

当上下文中的任意一层有这种“隐式”定义的变量时,那么该层的该变量会被修改,而不会在window上生成一个新的变量。(这种bug也挺讨厌的,尤其是封装的比较复杂的代码)
比如:


代码如下:

var x = "window.x";
function a() {
var x = "a's x";
var b = function() {
var c = function() {
//no var!
x = "c's x:";
};
alert("before c run,the b.x:" + x);
c();
alert("after c run, the b.x:" + x);
};
alert("a.x is:" + x);
b();
alert("after b function runed, the a.x is:" + x);
};
alert("before a run, window.x:" + x);
a();
alert("after a run, window.x:" + x);

这里面有以下几层:window, func a, func b, func c一直作层级嵌套。window->a->b->c
window和a中,都有定义变量x,b中未定义该变量,在c中‘隐式'声明了一个x,该x最终修改了a变量的值。
牢记,在JavaScript中,声明变量,一定前面要加var .

(0)

相关推荐

  • Javascript同时声明一连串(多个)变量的方法

    前言 js同时声明多个变量我们相信很多的朋都会反复的使用var来定义了,那么如果要更科学一点的方法要如何实现呢,下面我们一起来看一篇关于js声明变量的方法,具体细节如下所示. JS声明变量的办法我就不说了,如果需要学习的朋友们可以点击这篇文章. 我们经常需要连续声明好几个变量,当我是新手时,我是这么做的. var a=1; var b={}; var c=[]; var d=... 实际上我们可以这样: var a=1,b=2,c=3,d=4; 也就是用,分隔多个变量. 这样不换行的情况,只适合

  • 关于JavaScript中var声明变量作用域的推断

    一.迷思!由一段代码引发的疑惑 请看如下代码: 复制代码 代码如下: for(var i=0;i<3;i++) { console.log(j+","+k); for(var j=0;j<3;j++) { var k = j+1; } } console.log(i); 输出结果: undefined,undefined 3,3 3,3 3 如果你是搞c.java等语言的,可能你会不解,为何j.k这种局部变量可以被作用域外的代码访问呢? 如果JavaScript中用var声

  • 简单掌握JavaScript中const声明常量与变量的用法

    ES6引入的第三个声明类关键词与let类似:const. 看一下用法: const c1 = 1; const c2 = {}; const c3 = []; Object.getOwnPropertyDescriptor(window,"c1") //Object {value: 1, writable: false, enumerable: true, configurable: false} 上面的例子说,不能在对c2进行赋值,但是可以改变c2的内容,因为c2是个对象,看例子:

  • jsp中变量及方法的声明与使用

    本文实例讲述了jsp中变量及方法的声明与使用.分享给大家供大家参考,具体如下: <%@ page language="java" import="java.util.*" contentType="text/html;charset=GBK"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://&q

  • JavaScript中变量声明有var和没var的区别示例介绍

    本文来论述JavaScript中变量声明有var和没var的区别,关于Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是 (function(){ // ... })(); 在函数内部,有var和没var声明的变量是不一样的.有var声明的是局部变量,没var的,声明的全局变量,所以可以借此向外暴露接口东东. 在全局作用域内声明变量时,有var 和没var看起来都一样,我们知道,声明的全局变量,就是window的属性,究竟是否一样,我们通过ECMAScrpit5提供

  • JS声明变量背后的编译原理剖析

    只要是写过点JS代码,很简单一个var 就完事了.那对于JS编译器背后它又发生了什么呢?那就一步步通过代码来讲起. 复制代码 代码如下: x = 1; alert(x); var y = function() { alert(x); var x = 2; alert(x); } y(); 上面的代码也会你答对了它会分别输出:1,undefined,2.对于我来说,第一反应它会输出:1,1,2.为什么第二个会输出undefined?在上面我明确定义了一个全局变量x,为何找不到? 那是因为:js编译

  • 基于JavaScript 声明全局变量的三种方式详解

    JS中声明全局变量主要分为显式声明或者隐式声明下面分别介绍. 声明方式一: 使用var(关键字)+变量名(标识符)的方式在function外部声明,即为全局变量,否则在function声明的是局部变量.该方式即为显式声明详细如下: <script> var test = 5;//全局变量 function a(){ var a = 3;//局部变量 alert(a); } function b(){ alert(test); } //a();//调用a方法,那么方法里面的内容才会执行 //b(

  • JavaScript变量声明详解

    定义在函数体外的都属于全局变量,定义在函数体内的属于局部变量.这里的定义是指通过var声明的. JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性.例如: 复制代码 代码如下: function test(){     myname = "huming";     alert(myname); } test(); // "huming" alert(myname); //"huming" 两个结果是一样的,说明

  • 浅谈JavaScript中定义变量时有无var声明的区别

    前段时间回答了一个关于定义变量时使用关键字var与否的区别,总结回顾一下. 1.在函数作用域内 加var定义的变量是局部变量,不加var定义的就成了全局变量. 使用var定义: var a = 'hello World'; function bb(){ var a = 'hello Bill'; console.log(a); } bb() //'hello Bill' console.log(a); //'hello world' 不使用var定义: var a = 'hello World'

  • js 声明数组和向数组中添加对象变量的简单实例

    数组有四种定义的方式 使用构造函数: var a = new Array(); var b = new Array(10); var c = new Array("first", "second", "third"); 或者数组直接量: var d = ["first", "second", "third"]; 扩展: function ObjStory(id,biaoti,author

随机推荐