一、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作用域的更多相关文章

  1. JS作用域面试题总结

    关于JS作用域问题,是面试的时候面试官乐此不疲的面试题,有时候确实是令人抓狂,今天看到一个讲解这个问题的视频,明白了那些所谓的“原理”顿时有种豁然开朗的感觉~~~ 1.js作用域(全局变量,局部变量) ...

  2. js作用域问题

    <script type="text/javascript"> alert(i);//Uncaught ReferenceError: i is not defined ...

  3. js 作用域

    js 作用域 js作用域链查找,子函数能取到父函数中定义的变量. 前段时间误写成如下形式: 这只是普通的函数调用,没有父子的关系,child()函数会在全局查找pi变量,没找到所以报错. 最近发现原来 ...

  4. 08.01 签到! js 作用域

    js 作用域 : 1.js 没有块作用域 : for (var i = 0;i < 4; i++){ } alert(i) // i = 3 2.js 没有动态作用域: function f1( ...

  5. js作用域链

    js作用域链 <script> var up = 555; function display(){ var innerVar = 2; function inner(){ var inne ...

  6. easyui datagrid load 封装 参数问题 js 作用域

    var temp = { LoginAccount: $('#LoginAccount').val(), ShopName: $('#ShopName').val() }; function doSe ...

  7. js作用域零碎的知识点,不同的script块,虽然同是全局变量

    如下代码,第一次弹出a,因为解析器里找到var a,赋予a变量undefined,弹出undefined <!DOCTYPE html> <html> <head> ...

  8. JS作用域,作用域,作用链详解

    前言   通过本文,你大概明白作用域,作用域链是什么,毕竟这也算JS中的基本概念. 一.作用域(scope) 什么是作用域,你可以理解为你所声明变量的可用范围,我在某个范围内申明了一个变量,且这个变量 ...

  9. JS作用域和ASP(vbs)作用域比较

    一.js作用域,先上图: 以上代码执行的效果是,依次弹出 undefined, undefined, a, a,为什么是这样的结果啦?因为JS的作用域为链式作用域. 作用域链: 用VAR声明一个变量时 ...

  10. js作用域对象与运用技巧

    1. JS作用域 1.1 全局作用域和局部作用域 函数外面声明的就是 全局作用域 函数内是局部作用域 全局变量可以直接在函数内修改和使用 变量,使用var是声明,没有var是使用变量. 如果在函数内使 ...

随机推荐

  1. Git各大平台(win/Linux/Mac)图形化界面客户端大汇总

    摘要: 介绍各平台下的图形化界面git客户端(本人并没有全部使用过),欢迎大家补充新的软件或者使用感受~  一.TortoiseGit - The coolest Interface to Git V ...

  2. Hibernate入门学习-安装hibernate插件

    最近一直在学习ssh框架,为了更方便hibernate的使用,所以在eclipse下载hibernate插件,安装插件有两种方法 第一种:本地安装 1).插件的官网下载地址:http://tools. ...

  3. 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打印的 ...

  4. sqlServer、MySql批量操作插件

    SqlServer: 1.EntityFramework.BulkInsert  .只适用于SqlServer.要想实现MySql批量插入,得自己实现一些方法,注册驱动之类,暂时没能力. 2.z.en ...

  5. [LeetCode] Word Pattern 词语模式

    Given a pattern and a string str, find if str follows the same pattern. Examples: pattern = "ab ...

  6. [LeetCode] Second Highest Salary 第二高薪水

    Write a SQL query to get the second highest salary from the Employee table. +----+--------+ | Id | S ...

  7. ASP.NET - Web API,从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法

    一,简单类型的传值 比如 public Users Get(int id) ,它可以使用两种方式获取: api/default/ $.get("/api/default",{id: ...

  8. yii2使用小知识(连续补充)

    1,打印ar或者query的原始sql: $query = (new \yii\db\Query())->select(['a.username','b.item_name'])->fro ...

  9. Spring Aspectj切入点语法定义

    在使用spring框架配置AOP的时候,pointcut"切入点" 例如定义切入点表达式 execution(* com.sample.service.impl..*.*(..)) ...

  10. python基础补漏-03-函数

    函数:一般来说就是 以功能划分的代码模块 [1] 内置函数 一般我们使用的模块 ---可以大概有个了解 大多数的用法都很简单 2 [函数返回值] 我们应该控制函数的每条分支. 也就是说 我们得到的函数 ...