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是使用变量. 如果在函数内使 ...
随机推荐
- Git各大平台(win/Linux/Mac)图形化界面客户端大汇总
摘要: 介绍各平台下的图形化界面git客户端(本人并没有全部使用过),欢迎大家补充新的软件或者使用感受~ 一.TortoiseGit - The coolest Interface to Git V ...
- Hibernate入门学习-安装hibernate插件
最近一直在学习ssh框架,为了更方便hibernate的使用,所以在eclipse下载hibernate插件,安装插件有两种方法 第一种:本地安装 1).插件的官网下载地址:http://tools. ...
- Vuforia Android 6 Camera Error
环境 引擎: Unity 5.3.6f1 SDK: Vuforia 6.0.112 测试系统:Android 4.2/4.3 6.0 Android 6出错 在Android 6下Vuforia打印的 ...
- sqlServer、MySql批量操作插件
SqlServer: 1.EntityFramework.BulkInsert .只适用于SqlServer.要想实现MySql批量插入,得自己实现一些方法,注册驱动之类,暂时没能力. 2.z.en ...
- [LeetCode] Word Pattern 词语模式
Given a pattern and a string str, find if str follows the same pattern. Examples: pattern = "ab ...
- [LeetCode] Second Highest Salary 第二高薪水
Write a SQL query to get the second highest salary from the Employee table. +----+--------+ | Id | S ...
- ASP.NET - Web API,从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法
一,简单类型的传值 比如 public Users Get(int id) ,它可以使用两种方式获取: api/default/ $.get("/api/default",{id: ...
- yii2使用小知识(连续补充)
1,打印ar或者query的原始sql: $query = (new \yii\db\Query())->select(['a.username','b.item_name'])->fro ...
- Spring Aspectj切入点语法定义
在使用spring框架配置AOP的时候,pointcut"切入点" 例如定义切入点表达式 execution(* com.sample.service.impl..*.*(..)) ...
- python基础补漏-03-函数
函数:一般来说就是 以功能划分的代码模块 [1] 内置函数 一般我们使用的模块 ---可以大概有个了解 大多数的用法都很简单 2 [函数返回值] 我们应该控制函数的每条分支. 也就是说 我们得到的函数 ...