- 浏览: 176940 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
abc20899:
对啊!报错!楼主你测试了吗?
Java7 - 新特性之对集合类的语言支持 -
zskangs1126:
Facebook 的系统架构 -
ccxiajie:
List list={"hello"}; ...
Java7 - 新特性之对集合类的语言支持 -
luoyahu:
请不要把你的兴趣变成工作,因为那样会毁了你的兴趣。
一些对程序员的建议(不要轻易的让人帮你决定,那怕是你的家人) -
coral0212:
我也尝试创过业,但我觉得我这种人是“谋士”,不是能攻城拔寨的“ ...
一些对程序员的建议(不要轻易的让人帮你决定,那怕是你的家人)
尽管 JavaScript 支持一对花括号创建的代码段,但是并不支持块级作用域; 注意: 如果不是在赋值语句中,而是在 return 表达式或者函数参数中, 译者注:如果 JavaScript 中没有显式的命名空间定义,这就意味着所有对象都定义在一个全局共享的命名空间下面。 每次引用一个变量,JavaScript 会向上遍历整个作用域直到找到这个变量为止。 上面两段脚本效果不同。脚本 A 在全局作用域内定义了变量 再次强调,上面的效果完全不同,不使用 在函数 外部循环在第一次调用 JavaScript 中局部变量只可能通过两种方式声明,一个是作为函数参数,另一个是通过 JavaScript 会提升变量声明。这意味着 上面代码在运行之前将会被转化。JavaScript 将会把 没有块级作用域不仅导致 在原来代码中, 如果没有提升规则(hoisting)的知识,下面的代码看起来会抛出异常 实际上,上面的代码正常运行,因为 译者注:在 Nettuts+ 网站有一篇介绍 hoisting 的文章,其中的代码很有启发性。 JavaScript 中的所有作用域,包括全局作用域,都有一个特别的名称 函数作用域内也有默认的变量 比如,当访问函数内的 注意: 自定义 只有一个全局作用域导致的常见错误是命名冲突。在 JavaScript中,这可以通过 匿名包装器 轻松解决。 匿名函数被认为是 表达式;因此为了可调用性,它们首先会被执行。 有一些其他的调用函数表达式的方法,比如下面的两种方式语法不同,但是效果一模一样。 推荐使用匿名包装器(译者注:也就是自执行的匿名函数)来创建命名空间。这样不仅可以防止命名冲突, 另外,使用全局变量被认为是不好的习惯。这样的代码倾向于产生错误和带来高的维护成本。作用域与命名空间
而仅仅支持 函数作用域。function test() { // 一个作用域
for(var i = 0; i < 10; i++) { // 不是一个作用域
// count
}
console.log(i); // 10
}
{...}
将会作为代码段解析,
而不是作为对象的字面语法解析。如果考虑到 自动分号插入,这可能会导致一些不易察觉的错误。return
对象的左括号和 return
不在一行上就会出错。// 译者注:下面输出 undefined
function add(a, b) {
return
a + b;
}
console.log(add(1, 2));
如果到达全局作用域但是这个变量仍未找到,则会抛出 ReferenceError
异常。隐式的全局变量
// 脚本 A
foo = '42';
// 脚本 B
var foo = '42'
foo
,而脚本 B 在当前作用域内定义变量 foo
。var
声明变量将会导致隐式的全局变量产生。// 全局作用域
var foo = 42;
function test() {
// 局部作用域
foo = 21;
}
test();
foo; // 21
test
内不使用 var
关键字声明 foo
变量将会覆盖外部的同名变量。
起初这看起来并不是大问题,但是当有成千上万行代码时,不使用 var
声明变量将会带来难以跟踪的 BUG。// 全局作用域
var items = [/* 数组 */];
for(var i = 0; i < 10; i++) {
subLoop();
}
function subLoop() {
// subLoop 函数作用域
for(i = 0; i < 10; i++) { // 没有使用 var 声明变量
// 干活
}
}
subLoop
之后就会终止,因为 subLoop
覆盖了全局变量 i
。
在第二个 for
循环中使用 var
声明变量可以避免这种错误。
声明变量时绝对不要遗漏 var
关键字,除非这就是期望的影响外部作用域的行为。局部变量
var
关键字声明。// 全局变量
var foo = 1;
var bar = 2;
var i = 2;
function test(i) {
// 函数 test 内的局部作用域
i = 5;
var foo = 3;
bar = 4;
}
test(10);
foo
和 i
是函数 test
内的局部变量,而对 bar
的赋值将会覆盖全局作用域内的同名变量。变量声明提升(Hoisting)
var
表达式和 function
声明都将会被提升到当前作用域的顶部。bar();
var bar = function() {};
var someValue = 42;
test();
function test(data) {
if (false) {
goo = 1;
} else {
var goo = 2;
}
for(var i = 0; i < 100; i++) {
var e = data[i];
}
}
var
表达式和 function
声明提升到当前作用域的顶部。// var 表达式被移动到这里
var bar, someValue; // 缺省值是 'undefined'
// 函数声明也会提升
function test(data) {
var goo, i, e; // 没有块级作用域,这些变量被移动到函数顶部
if (false) {
goo = 1;
} else {
goo = 2;
}
for(i = 0; i < 100; i++) {
e = data[i];
}
}
bar(); // 出错:TypeError,因为 bar 依然是 'undefined'
someValue = 42; // 赋值语句不会被提升规则(hoisting)影响
bar = function() {};
test();
var
表达式被从循环内移到外部,而且使一些 if
表达式更难看懂。if
表达式看起来修改了全部变量 goo
,实际上在提升规则被应用后,却是在修改局部变量。ReferenceError
。// 检查 SomeImportantThing 是否已经被初始化
if (!SomeImportantThing) {
var SomeImportantThing = {};
}
var
表达式会被提升到全局作用域的顶部。var SomeImportantThing;
// 其它一些代码,可能会初始化 SomeImportantThing,也可能不会
// 检查是否已经被初始化
if (!SomeImportantThing) {
SomeImportantThing = {};
}
// 译者注:来自 Nettuts+ 的一段代码,生动的阐述了 JavaScript 中变量声明提升规则
var myvar = 'my value';
(function() {
alert(myvar); // undefined
var myvar = 'local value';
})();
名称解析顺序
this
指向当前对象。arguments
,其中包含了传递到函数中的参数。foo
变量时,JavaScript 会按照下面顺序查找:
var foo
的定义。foo
名称的。foo
。
arguments
参数将会阻止原生的 arguments
对象的创建。命名空间
(function() {
// 函数创建一个命名空间
window.foo = function() {
// 对外公开的函数,创建了闭包
};
})(); // 立即执行此匿名函数
( // 小括号内的函数首先被执行
function() {}
) // 并且返回函数对象
() // 调用上面的执行结果,也就是函数对象
// 另外两种方式
+function(){}();
(function(){}());
结论
而且有利于程序的模块化。
发表评论
-
JavaScript Garden - instanceof 操作符
2011-03-31 23:59 1085instanceof 操作符 instanceof 操 ... -
JavaScript Garden - 该死的typeof 操作符
2011-03-31 23:58 1361typeof 操作符 typeof 操作符(和 ... -
JavaScript Garden - 类型转换
2011-03-31 23:55 889类型转换 JavaScript 是弱类型语言,所以会在任 ... -
JavaScript Garden - 相等与比较
2011-03-31 23:53 886相等与比较 JavaScript 有两种方式判断两个值是 ... -
JavaScript Garden - setTimeout 和 setInterval
2011-03-31 23:52 1277setTimeout 和 setInterval 由 ... -
JavaScript Garden - 为什么不要使用 eval
2011-03-31 23:50 1281为什么不要使用 eval eval 函数会在当前作用域 ... -
JavaScript Garden -自动分号插入
2011-03-31 23:48 1128自动分号插入 尽管 JavaScript 有 C 的代码 ... -
JavaScript Garden - undefined 和 null
2011-03-31 23:46 919undefined 和 null JavaScrip ... -
JavaScript Garden - Array 构造函数
2011-03-31 23:44 820Array 构造函数 由于 Array 的构造函数在如 ... -
JavaScript Garden - 数组遍历与属性
2011-03-31 23:43 1086数组遍历与属性 虽然在 JavaScript 中数组是是 ... -
JavaScript Garden - arguments 对象
2011-03-31 23:42 1054arguments 对象 JavaScript 中每个 ... -
JavaScript Garden - 闭包和引用
2011-03-31 23:39 1090闭包和引用 闭包是 JavaScript 一个非常重要的 ... -
JavaScript Garden - 构造函数
2011-03-31 23:38 855构造函数 JavaScript 中 ... -
JavaScript Garden - 函数声明与表达式
2011-03-31 23:36 845函数声明与表达式 函 ... -
JavaScript Garden - this 的工作原理
2011-03-31 23:35 855this 的工作原理 JavaScript 有一套完全 ... -
JavaScript Garden - for in 循环
2011-03-31 23:26 772for in 循环 和 in 操作符一样,for in ... -
JavaScript Garden - hasOwnProperty 函数
2011-03-31 23:25 956hasOwnProperty 函数 为了判断一个对象 ... -
JavaScript Garden - 原型
2011-03-31 23:23 956原型 JavaScript 不包含传统的类继承模型,而是 ... -
JavaScript Garden - 对象使用和属性
2011-03-31 23:22 803对象使用和属性 JavaScript 中所有变量都 ...
相关推荐
计算机后端-Java-PHP视频教程javascript01-8 作用域.wmv
作用域与作用域链作用域类别全局作用域函数作用域块作用域:Es6时出现,之前没有作用域与执行上下文区别创建时机不同全局作用域外,每个函数都有自己的作用域,作用域在
由于作用域问题,不能清除定时器运用场景:循环一个对象,执行对应的定时器操作,然后估计对象里面的属性的值的不同情况,停止定时器//len 取的外部变量//这里运用
javascript变量作用域 希望对大家有帮助
对javascript执行环境,作用域的深层次理解,
JavaScript教程--从入门到精通JavaScript教程--从入门到精通JavaScript教程--从入门到精通JavaScript教程--从入门到精通JavaScript教程--从入门到精通JavaScript教程--从入门到精通JavaScript教程--从入门到精通...
动态作用域在任何JS核心引擎中,都有一张全局表来存储全局变量// 动态作用域,任何JS核心引擎中,有个全局查找表const stackBinder = make
JavaScript教程--从入门到精通(PPT精简版).ppt
JavaScript应用实例-js块级作用域.js
第16周-第15章节-Python3.5-JavaScript作用域(二).avi
第16周-第14章节-Python3.5-JavaScript作用域(一).avi
JavaScript教程--从入门到精通.pdf JavaScript教程--从入门到精通.pdf JavaScript教程--从入门到精通.pdf JavaScript教程--从入门到精通.pdf
javascript的变量作用域,与平时使用的类C语言不同,例如C#中的代码: static void Main(string[] args) { if(true) { int number=10; } Console.WriteLine(number); } 这段代码进行编译,是无法通过的,...
Javascript 中也没有显示的命名空间,这就意味着一切都定义在全局作用域中。每一次引用一个变量时,Javascript 会往上遍历整个全局作用域直到找到该变量。如果遍历完整个全局作用域仍然没有找到该变量,则抛出一个 ...
理解JavaScript变量作用域.pdf 本人还有几十本经典javascript书籍以及无数javascript资料,要的加我qq 568094881,本人网址:www.maoshanhai.com
任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。在代码中任何地方都能...
讲述了webstorm ,js的作用域,分了六个部分为大家解释:一、作用域;二、全局作用域;三、局部作用域;四、块作用域;五、函数作用域;六、作用域链
高性能JavaScript编程-高清-带书签.pdf高性能JavaScript编程-高清-带书签.pdf高性能JavaScript编程-高清-带书签.pdf高性能JavaScript编程-高清-带书签.pdf
计算机后端-Java-PHP视频教程javascript01-8 作用域.wmv