- 浏览: 182529 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 1124instanceof 操作符 instanceof 操 ... -
JavaScript Garden - 该死的typeof 操作符
2011-03-31 23:58 1398typeof 操作符 typeof 操作符(和 ... -
JavaScript Garden - 类型转换
2011-03-31 23:55 937类型转换 JavaScript 是弱类型语言,所以会在任 ... -
JavaScript Garden - 相等与比较
2011-03-31 23:53 921相等与比较 JavaScript 有两种方式判断两个值是 ... -
JavaScript Garden - setTimeout 和 setInterval
2011-03-31 23:52 1323setTimeout 和 setInterval 由 ... -
JavaScript Garden - 为什么不要使用 eval
2011-03-31 23:50 1317为什么不要使用 eval eval 函数会在当前作用域 ... -
JavaScript Garden -自动分号插入
2011-03-31 23:48 1173自动分号插入 尽管 JavaScript 有 C 的代码 ... -
JavaScript Garden - undefined 和 null
2011-03-31 23:46 956undefined 和 null JavaScrip ... -
JavaScript Garden - Array 构造函数
2011-03-31 23:44 863Array 构造函数 由于 Array 的构造函数在如 ... -
JavaScript Garden - 数组遍历与属性
2011-03-31 23:43 1133数组遍历与属性 虽然在 JavaScript 中数组是是 ... -
JavaScript Garden - arguments 对象
2011-03-31 23:42 1087arguments 对象 JavaScript 中每个 ... -
JavaScript Garden - 闭包和引用
2011-03-31 23:39 1127闭包和引用 闭包是 JavaScript 一个非常重要的 ... -
JavaScript Garden - 构造函数
2011-03-31 23:38 888构造函数 JavaScript 中 ... -
JavaScript Garden - 函数声明与表达式
2011-03-31 23:36 897函数声明与表达式 函 ... -
JavaScript Garden - this 的工作原理
2011-03-31 23:35 908this 的工作原理 JavaScript 有一套完全 ... -
JavaScript Garden - for in 循环
2011-03-31 23:26 805for in 循环 和 in 操作符一样,for in ... -
JavaScript Garden - hasOwnProperty 函数
2011-03-31 23:25 1000hasOwnProperty 函数 为了判断一个对象 ... -
JavaScript Garden - 原型
2011-03-31 23:23 992原型 JavaScript 不包含传统的类继承模型,而是 ... -
JavaScript Garden - 对象使用和属性
2011-03-31 23:22 837对象使用和属性 JavaScript 中所有变量都 ...
相关推荐
JavaScript 变量作用域详解 JavaScript 变量作用域是基于其特有的作用域链的。在 JavaScript 中,变量作用域是指变量可以被访问和修改的范围。 JavaScript 没有块级作用域,而是基于函数作用域和全局作用域的。 ...
计算机后端-Java-PHP视频教程javascript01-8 作用域.wmv
JavaScript主要有两种作用域:全局作用域和函数作用域,而没有像C#、C、Java那样的块级作用域。在全局作用域中,变量在整个代码中都是可访问的;而在函数内部声明的变量,则只在该函数内部可见,这就是函数作用域。 ...
JavaScript作用域是编程中至关重要的概念,它规定了变量和函数的可见性及生命周期。JavaScript主要有两种作用域:全局作用域和局部作用域。 全局作用域是指在代码的任何位置都可以访问的变量或函数,这通常包括在最...
深化理解javascript作用域其次篇之词法作用域和动态作用域_ 深化理解javascript作用域其次篇之词法作用域和动态作用域,是javascript中非常重要的一部分。理解词法作用域和动态作用域对javascript的编程至关重要。...
闭包是JavaScript中的另一个与作用域相关的概念。闭包是指函数能够记住并访问其词法作用域,即使在其父函数已经执行完毕后。这种能力使得闭包可以用来实现数据隐藏、模块化和内存管理等高级功能。 理解JavaScript的...
动态作用域在任何JS核心引擎中,都有一张全局表来存储全局变量// 动态作用域,任何JS核心引擎中,有个全局查找表const stackBinder = make
内容概要:本文详细介绍了 JavaScript 中的函数与作用域。首先解释了函数的基本概念,包括函数声明、函数表达式、匿名函数、箭头函数、函数参数与返回值。接着讨论了 JavaScript 中的全局作用域、局部作用域、块级...
JavaScript应用实例-js块级作用域.js
### JavaScript:函数与作用域 #### 一、函数基础 **1.1 函数声明与表达式** 在JavaScript中,函数是一段可重用的代码块,用来执行特定任务。函数可以通过两种方式进行定义:函数声明和函数表达式。 - **函数...
在JavaScript编程中,作用域和作用域链是影响程序性能的关键因素之一。优化作用域链是提高JavaScript代码执行效率的重要手段。下面我们从多个方面来详细探讨作用域链的概念、作用域链的层级关系、变量访问的性能影响...
2. **函数**: 包括函数声明与表达式、`this`的工作原理、闭包与引用、`arguments`对象、构造函数、作用域与命名空间等内容,深入探讨了函数的灵活性和复杂性。 3. **数组**: 阐述了数组的遍历与属性、`Array`构造...
Javacript 中有一系列作用域的概念。对于新的JS的开发人员无法理解这些概念,甚至一些经验丰富的开发者也未必能。这篇文章主要目的帮助... 什么是命名空间和作用域的区别? 什么是this关键字且作用域对其的影响? 什
2. **函数与作用域** - 函数定义与调用:函数是可重复使用的代码块,通过`function`关键字创建。函数参数和返回值是其重要组成部分。 - 作用域:JavaScript有全局作用域和局部作用域,`var`变量在函数内部声明时为...
JavaScript是前端开发中的核心语言,其作用域和闭包机制是理解JS运行原理的关键部分。在本章节中,我们将深入探讨这两个概念,帮助你攀登"三座大山"中的第二座——闭包。 首先,我们要了解JavaScript的作用域。作用...
本篇将详细解释JavaScript作用域的几个核心特性,包括无块级作用域、函数作用域、作用域链以及作用域链的创建时间。 1. 无块级作用域 不同于Java或C#,JavaScript并没有块级作用域,这意味着在JavaScript中,大括号...
### JavaScript 创建命名空间的五种方法 #### 一、通过函数创建命名空间 在JavaScript中,使用函数创建命名空间是一种常见的做法。这种方法主要是利用函数来封装命名空间内的成员,包括属性和方法。这种方式的优点...
LoadMod ( 'https://rawgit.com/yannprada/cookie-garden-helper/master/cookie-garden-helper.js' ) ; } ( ) ) ; 这个怎么运作 首先,点击花园/农场底部的“ Cookie Garden Helper ”按钮。 在这里,您可以配置您...
JavaScript是一种广泛用于网页开发的脚本语言,它的函数和作用域是实现代码逻辑结构和模块...理解JavaScript中的变量作用域非常重要,它有助于避免变量命名冲突和意外的变量修改,从而编写出更加健壮和易于维护的代码。