js作用域
一、js没有块级作用域
在c,java等语言中花括号里的代码都有自己的作用域,而js花括号没有块级作用域,经常会导致一些困惑,不明所以。例如:
console.info(color);
if(true){
var color = "blue";
}
console.info(color);
输出结果:undefined blue
这里开始没有定义color变量,一般来说应该报错,可是没有,是因为if语句里定义了color变量,因为没有块级作用域,第二次输出的是blue。
上面的代码等同于下面代码:
var color;
console.info(color);
if(true){
color = "blue";
}
console.info(color);
在使用for循环的时候要注意这一点:
for(var i=0;i<10;i++){
doSomething(i);
}
console.info(i);
对于js没有块级作用域,所以会输出10。
二、声明变量
function add(num1,num2){
var sum = num1 + num2;
return sum;
}
var result = add(10,20);
console.info(result);
console.info(sum);
结果:30 Uncaught ReferenceError: sum is not defined(…)
原因:sum变量是在函数add中声明的,所以sum只能在函数中使用,不能在函数外使用。在函数中使用var声明变量,其作用域只能是在函数中
下面的代码只是将add函数中的var去掉
function add(num1,num2){
var sum = num1 + num2;
return sum;
}
var result = add(10,20);
console.info(result);
console.info(sum);
结果:30 30
原因:没有在函数内使用var关键字声明,于是在调用完add函数,将sum变量添加到全局变量中。所以即使函数执行完毕,全局也可以使用该变量。
三、搜索变量
变量的搜索是从作用链的前端开始,一级一级的搜索,如果在局部搜索到,则停止,否则一直追溯到全局环境的变量。
color="blue";
function t(){
console.log(color);
var color="red";
function s(){
var color="yellow";
console.log(color);
}
function ss(){
console.log(color);
}
s();
ss();
}
t();
console.log(color);
结果:undefined yellow red blue
原因 :第一个:js没有块级作用域,所以相当于声明,但是未定义,结果是undefined;第二个:函数s中的定义了color变量,则输出yellow;
第三个:函数ss中未声明定于color,则向作用域链上级查找,找到函数t中,结果是red;第四个:找到声明的color,结果是blue
typeof检测变量的数据类型:
"undefined"--值未定义
"boolean"--布尔值
"string"--字符串
"number"--数值
"object"--对象或者null
"function"--函数
js作用域的更多相关文章
- JS作用域面试题总结
关于JS作用域问题,是面试的时候面试官乐此不疲的面试题,有时候确实是令人抓狂,今天看到一个讲解这个问题的视频,明白了那些所谓的“原理”顿时有种豁然开朗的感觉~~~ 1.js作用域(全局变量,局部变量) ...
- js作用域问题
<script type="text/javascript"> alert(i);//Uncaught ReferenceError: i is not defined ...
- js 作用域
js 作用域 js作用域链查找,子函数能取到父函数中定义的变量. 前段时间误写成如下形式: 这只是普通的函数调用,没有父子的关系,child()函数会在全局查找pi变量,没找到所以报错. 最近发现原来 ...
- 08.01 签到! js 作用域
js 作用域 : 1.js 没有块作用域 : for (var i = 0;i < 4; i++){ } alert(i) // i = 3 2.js 没有动态作用域: function f1( ...
- js作用域链
js作用域链 <script> var up = 555; function display(){ var innerVar = 2; function inner(){ var inne ...
- easyui datagrid load 封装 参数问题 js 作用域
var temp = { LoginAccount: $('#LoginAccount').val(), ShopName: $('#ShopName').val() }; function doSe ...
- js作用域零碎的知识点,不同的script块,虽然同是全局变量
如下代码,第一次弹出a,因为解析器里找到var a,赋予a变量undefined,弹出undefined <!DOCTYPE html> <html> <head> ...
- JS作用域,作用域,作用链详解
前言 通过本文,你大概明白作用域,作用域链是什么,毕竟这也算JS中的基本概念. 一.作用域(scope) 什么是作用域,你可以理解为你所声明变量的可用范围,我在某个范围内申明了一个变量,且这个变量 ...
- JS作用域和ASP(vbs)作用域比较
一.js作用域,先上图: 以上代码执行的效果是,依次弹出 undefined, undefined, a, a,为什么是这样的结果啦?因为JS的作用域为链式作用域. 作用域链: 用VAR声明一个变量时 ...
- js作用域对象与运用技巧
1. JS作用域 1.1 全局作用域和局部作用域 函数外面声明的就是 全局作用域 函数内是局部作用域 全局变量可以直接在函数内修改和使用 变量,使用var是声明,没有var是使用变量. 如果在函数内使 ...
随机推荐
- Login控件尝试
新建web项目,添加default.aspx.Register.aspx.Login.aspx. default.aspx中添加LoginName.LoginStatus,LoginName的Form ...
- 路由集合中已存在名为“ XXXX” 的路由
一般是认为路由的名字Key重复了,改下就行,但是还有种情况,你发现不是的,你把Key名称改了就好,不改就有问题.为什么?那就是有可能在bin目录下其它的DLL中有重复的Key了,这个时候,就要看看该改 ...
- centos mysql开启远程访问
登录MySQL: mysql -u root -p db; 如需修改密码,第一次: mysqladmin -u root password NEWPASSWORD 已设置过: mysqladmi ...
- rxjs5.X系列 —— filter系列 api 笔记
欢迎指导与讨论 :) 前言 本文是笔者翻译 RxJS 5.X 官网各类operation操作系列的的第二篇 -- filter转换.如有错漏,希望大家指出提醒O(∩_∩)O.更详细的资料尽在rxjs官 ...
- [LeetCode] Total Hamming Distance 全部汉明距离
The Hamming distance between two integers is the number of positions at which the corresponding bits ...
- [LeetCode] Flatten Nested List Iterator 压平嵌套链表迭代器
Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...
- C#定义类型转化 及 格式化字符串
operator 关键字 operator 关键字用来重载内置运算符,或提供类/结构声明中的用户定义转换.它可以定义不同类型之间采用何种转化方式和转化的结果. operator用于定义类型转化时可采用 ...
- table表框去掉相邻的间隔
HTML <table> <tr> <th>名称</th> <th>描述</th> </tr> <tr> ...
- ASP.NET web.config中的连接字符串
在ASP.NET的web.config中,可以用两种方式来写连接字符串的配置. <configuration> <appSettings> <add key=" ...
- MVC中得到成员元数据的Description特性描述信息公用方法
#region 从类型成员获取指定的Attribute T特性集合 /// <summary> /// 从类型成员获取指定的Attribute T特性集合 /// </summary ...