- 浏览: 181556 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 1117instanceof 操作符 instanceof 操 ... -
JavaScript Garden - 该死的typeof 操作符
2011-03-31 23:58 1392typeof 操作符 typeof 操作符(和 ... -
JavaScript Garden - 类型转换
2011-03-31 23:55 928类型转换 JavaScript 是弱类型语言,所以会在任 ... -
JavaScript Garden - 相等与比较
2011-03-31 23:53 917相等与比较 JavaScript 有两种方式判断两个值是 ... -
JavaScript Garden - setTimeout 和 setInterval
2011-03-31 23:52 1317setTimeout 和 setInterval 由 ... -
JavaScript Garden - 为什么不要使用 eval
2011-03-31 23:50 1309为什么不要使用 eval eval 函数会在当前作用域 ... -
JavaScript Garden -自动分号插入
2011-03-31 23:48 1162自动分号插入 尽管 JavaScript 有 C 的代码 ... -
JavaScript Garden - undefined 和 null
2011-03-31 23:46 950undefined 和 null JavaScrip ... -
JavaScript Garden - Array 构造函数
2011-03-31 23:44 856Array 构造函数 由于 Array 的构造函数在如 ... -
JavaScript Garden - 数组遍历与属性
2011-03-31 23:43 1125数组遍历与属性 虽然在 JavaScript 中数组是是 ... -
JavaScript Garden - arguments 对象
2011-03-31 23:42 1081arguments 对象 JavaScript 中每个 ... -
JavaScript Garden - 闭包和引用
2011-03-31 23:39 1118闭包和引用 闭包是 JavaScript 一个非常重要的 ... -
JavaScript Garden - 构造函数
2011-03-31 23:38 883构造函数 JavaScript 中 ... -
JavaScript Garden - 函数声明与表达式
2011-03-31 23:36 889函数声明与表达式 函 ... -
JavaScript Garden - this 的工作原理
2011-03-31 23:35 902this 的工作原理 JavaScript 有一套完全 ... -
JavaScript Garden - for in 循环
2011-03-31 23:26 800for in 循环 和 in 操作符一样,for in ... -
JavaScript Garden - hasOwnProperty 函数
2011-03-31 23:25 991hasOwnProperty 函数 为了判断一个对象 ... -
JavaScript Garden - 原型
2011-03-31 23:23 988原型 JavaScript 不包含传统的类继承模型,而是 ... -
JavaScript Garden - 对象使用和属性
2011-03-31 23:22 832对象使用和属性 JavaScript 中所有变量都 ...
相关推荐
JavaScript作用域是指在JavaScript代码中,变量、常量、对象和函数能够访问的范围。在编程中,变量和函数的使用都受到作用域的限制,决定了它们能够在哪些代码块中被引用。作用域有助于防止变量命名冲突,也使得程序...
JavaScript是一种广泛用于网页和网络应用的编程语言,其核心特性之一就是变量作用域。变量作用域决定了变量在何处可以被访问以及何时会被销毁。本文将深入探讨JavaScript中的全局变量、局部变量、变量提升、词法作用...
由于作用域问题,不能清除定时器运用场景:循环一个对象,执行对应的定时器操作,然后估计对象里面的属性的值的不同情况,停止定时器//len 取的外部变量//这里运用
JavaScript作用域是编程中至关重要的概念,它规定了变量和函数的可见性及生命周期。JavaScript主要有两种作用域:全局作用域和局部作用域。 全局作用域是指在代码的任何位置都可以访问的变量或函数,这通常包括在最...
JavaScript中,作用域和上下文是理解代码执行逻辑的关键概念。作用域指的是变量和函数的可见性和生命周期,而上下文则关乎`this`关键字的值,它指示了当前代码执行的环境。 **作用域(Scope)** 1. **全局作用域**...
### JavaScript Garden:深入探讨JavaScript中的陷阱与注意事项 #### 引言 《JavaScript Garden》是一份不断更新、详尽记录了JavaScript编程语言中最易犯错误、陷阱及细微问题的指南。该文档不仅帮助开发者规避常见...
- 在JavaScript中,每个执行上下文都有一个与之相关联的作用域链。作用域链是一个对象列表,用于存储变量和函数声明。 - 当JavaScript引擎需要查找变量时,它会从当前作用域开始,沿着作用域链向上查找,直到找到...
JavaScript应用实例-js块级作用域.js
基于JavaScript的变量作用域的辨析 本文探讨了JavaScript中的变量作用域问题,通过对两种变量的特性从不同角度进行分析和测试,讨论了如何控制变量作用域的有效方法。 变量作用域是JavaScript编程过程中经常遇到的...
### JavaScript:函数与作用域 #### 一、函数基础 **1.1 函数声明与表达式** 在JavaScript中,函数是一段可重用的代码块,用来执行特定任务。函数可以通过两种方式进行定义:函数声明和函数表达式。 - **函数...
第16周-第15章节-Python3.5-JavaScript作用域(二).avi
第16周-第14章节-Python3.5-JavaScript作用域(一).avi
2. **函数**: 包括函数声明与表达式、`this`的工作原理、闭包与引用、`arguments`对象、构造函数、作用域与命名空间等内容,深入探讨了函数的灵活性和复杂性。 3. **数组**: 阐述了数组的遍历与属性、`Array`构造...
javascript的变量作用域,与平时使用的类C语言不同,例如C#中的代码: static void Main(string[] args) { if(true) { int number=10; } Console.WriteLine(number); } 这段代码进行编译,是无法通过的,...
理解JavaScript变量作用域.pdf 本人还有几十本经典javascript书籍以及无数javascript资料,要的加我qq 568094881,本人网址:www.maoshanhai.com
任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。在代码中任何地方都能...
Javacript 中有一系列作用域的概念。对于新的JS的开发人员无法理解这些概念,甚至一些经验丰富的开发者也未必能。这篇文章主要目的帮助... 什么是命名空间和作用域的区别? 什么是this关键字且作用域对其的影响? 什
JavaScript作用域是编程中至关重要的概念,尤其是在JavaScript这种动态类型的脚本语言中。它规定了变量、函数以及其它标识符的可见性和生命周期,是代码组织和管理的关键元素。本资料"深入理解JavaScript作用域共12...
JavaScript中的作用域是编程语言中一个关键的概念,它决定了变量和函数在何处可被访问以及它们的生命周期。在JavaScript中,有两种主要的作用域类型:全局作用域和局部作用域。 全局作用域指的是在代码的任何位置都...
JavaScript中的作用域链是编程中一个至关重要的概念,它决定了变量和函数的可访问性以及在不同作用域内的查找顺序。在深入理解作用域链之前,我们首先要了解什么是执行环境和变量对象。 执行环境,简单来说,就是...