javascript基础详解-作用域
来源:互联网 发布:匡恩网络物联网安全 编辑:程序博客网 时间:2024/05/22 12:31
JavaScript语言的作用域仅存在于函数范围中。这是必须要牢记的一点,还有一点重要的就是作用域的提升规则。
作用域问题
JS最容易出现混淆的就是作用域的情况。传统的类C语言,它们的作用域是block-level scope
,块级作用域, 花括号就是一个作用域。但是对于JavaScript而言,它的作用域是function-level scope
,比如if条件语句,就不算一个独立的作用域:
var x = 1;console.log(x); // 1if (true) { var x = 2; console.log(x); // 2}console.log(x); // 2
在JavaScript中,如果我们需要实现block-level scope
,我们也有一种变通的方式,那就是通过自执行函数创建临时作用域:
function foo() { var x = 1; if (x) { (function () { var x = 2; // some other code }()); } // x is still 1.}
作用域提升
变量被提升
对JavaScript解释器而言,所有的函数和变量声明都会被提升到最前面, 并且变量声明永远在前面,赋值在声明过程之后。比如:
var x = 10;function x(){};console.log(x); // 10
实际上被解释为:
var x;function x(){};x = 10;console.log(x); // 10
函数被提升
函数的声明方式主要由两种:声明式和变量式。
声明式会自动将声明放在前面并且执行赋值过程。而变量式则是先将声明提升,然后到赋值处再执行赋值。比如:
function test() { foo(); // TypeError "foo is not a function" bar(); // "this will run!" var foo = function () { // function expression assigned to local variable 'foo' alert("this won't run!"); } function bar() { // function declaration, given the name 'bar' alert("this will run!"); }}test();
实际上等价于:
function test() { var foo; var bar; bar = function () { // function declaration, given the name 'bar' alert("this will run!"); } foo(); // TypeError "foo is not a function" bar(); // "this will run!" foo = function () { // function expression assigned to local variable 'foo' alert("this won't run!"); }}test();
主要注意的地方:带有命名的函数变量式声明,是不会提升到作用域范围内的,比如:
var baz = function spam() {};baz(); // vaildspam(); // ReferenceError "spam is not defined"
实战经验
任何时候,请使用var
声明变量, 并放置在作用域的顶端.
工具推荐JSLint
之类,帮助你验证语法的规范。
1 0
- javascript基础详解-作用域
- JavaScript作用域详解
- 详解JavaScript作用域
- javascript 作用域详解
- javascript作用域详解
- javascript基础详解-执行环境与作用域链
- JavaScript基础(11.JS难点:作用域详解)
- javaScript基础:作用域相关
- JavaScript作用域基础原理
- javascript 函数作用域 详解
- JavaScript基础:变量的作用域
- Javascript中基础-词法作用域
- JavaScript 基础(004_作用域)
- JavaScript 基础笔记 3作用域
- JavaScript基础之函数变量作用域
- 基础决定高度:JavaScript中的作用域,JS作用域
- Javascript基础_11作用域与块级作用域
- JavaScript作用域链及案例详解
- 中南大学第十一届大学生程序设计竞赛-COJ1896-Symmetry
- 版本控制工具
- Ubuntu16.04LTS安装eclipse C++
- 使用js获取当地各种时间
- 静态重定位与动态重定位
- javascript基础详解-作用域
- java中volatile关键字的含义
- opencv3实现一幅图像分割成多幅图像
- [莫队 分块] BZOJ 4866 [Ynoi2017]由乃的商场之旅
- 使用spring-hbaseTemplate过滤器
- MySQL 占用空间一键查询实践[申明:来源于网络]
- 活动中使用menu
- Linux与BSD中TCP协议栈实现比较
- JAVA操作MongoDB