JS变量提升和作用域】的更多相关文章

一.JS变量提升 1.当浏览器引擎解析js代码时,将js中的所有一开始就是var声明的和function声明的都提升到全局.此时又叫全局作用域 console.log(aa); console.log(ff); console.log(bb); var aa = "aa"; function ff(){ console.log("ff"); } 注意:undefined和is not defined是不一样的. undefined:声明了该变量但是调用时没有定义值…
JS 变量提升与函数提升 JS变量提升 变量提升是指:使用var声明变量时,JS会将变量提升到所处作用域的顶部.举个简单的例子: 示例1 console.log(foo); // undefined var foo = 'JavaScript'; // 输出 undefined 上面的例子中,在声明变量foo之前打印这个变量,输出了undefined而没有报错. 这样的现象在函数中同样存在: 示例2 function example(){ console.log(foo); var foo =…
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http://www.cnblogs.com/lvonve/ 在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目.现在就让我们一起进入 Web 前端学习的冒险之旅吧! js变量提升与函数提升的详细过程 先来看两个栗子,下面的两段代码分别输出什么? // 代…
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> var a = 100; function t() { alert(a); var a = 10; } t(); //输出结果为undefine…
关于js变量提升 变量提升 在js函数内部是可以直接修改全局的变量的,个人感觉是不好的设计, 但是确实存在这个概念 原理: 先查看有没有函数变量bb 查看形参有没有bb 查看全局有没有bb 报错, 找不到bb变量 修改函数内部 var bb = 1; function foo(cc){ var bb = 2; // 这里的bb, 其实是函数的局部变量 console.log(cc); } foo(bb); // 1 console.log(bb); // 1 修改的是形参 var bb = 1;…
一.前言 Uncaught TypeError: ... is not a function function max(){}表示函数声明,可以放在代码的任何位置,也可以在任何地方成功调用: var max  = function(){};表示函数表达式,即将一个匿名函数赋值给一个变量,实现通过变量来调用这个匿名函数,但它需要在声明过后才能进行调用,如果调用在声明之前就会报如上红色字体的错误.而这在函数声明中不会出现这样的错误. 二.正文 (一).代码示例 //函数表达式 myFunc();//…
关于js的变量,开始的时候我们都会被告知,变量声明应该在引用该变量之前.关于为什么要这样做呢,开始的时候本着会用就行的目的,也没去深究.不过后来经常会发现一些让人很费解的..姑且称为现象吧.先看一段代码再说: function a(){ alert(a); var a = 'b' } a();//undefined 此时就会发现不遵守规则的下场了,结果不是你想要的..当然我们不能说只知道要怎么写就行了.要知其然也要知其所以然,究其原因,就涉及到两个概念js作用域和词法分析了. 都知道js中不存在…
function log(str) { // 本篇文章所有的打印都将调用此方法 console.log(str); } 函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部 变量声明.命名.提升 在JS中, 变量有4种基本方式进入作用域: 语言内置: 所有的作用域里都有this和arguments:(需要注意的是arguments在全局作用域是不可见的) 形式参数: 函数的形式参数会作为函数体作用域的一部分: 函数声明: 像这种形式: function foo() {}: 变量声明:…
var a = 1; function foo() { console.log(a); var a = 2; } foo(); //undefined 根据变量提升机制,最后得出undefined; 变量提升是指在一个作用域中声明的变量,JS解析时会把变量声明提升至作用域内的第一行,也就是说上面那段代码等同于: var a = 1; function foo() { var a; //被提升至作用域内第一行 console.log(a); var a = 2; } foo(); 因此,也就可以理…
在es6之前,js语言并没有块级作用域,即{}形成的作用域,只有全局作用域和函数作用域,所谓的提升,即是将该变量的声明或者函数的声明提升,举个例子 console.log(global); //undefined var global = 111; console.log(global);//111 显然,上面代码处于一个全局的作用域中,在该作用域中使用var声明了一个global变量,其实际的声明过程如下: var global; console.log(global); //undefine…
作为世界上最优美的语言javascript的使用者,呵呵,js的魅力是无穷的,今天来聊聊他的魅(dan)力(teng)之一,变量提升. 每种语言所定义的变量基本都会有一定得作用域,而js的作用域则存在着一定的陷阱.首先看一下下面一道题: <script> var str1 = "haha"; var str2 = "hehe"; function t1() { console.log(str1); console.log(str2); var str2…
Javascript是一门容易遭人误解的语言,但是它的强大毋庸置疑.个人觉得,要想深入理解Javascript语言,首先必须对其基本的概念(例如:Scope,Closure,Hoisting等)要真正理解.今天想通过自己的理解来对Javascript Hoisting(国内一般翻译为 变量提升)做一个阐述: 在解释Javascript Hoisting之前,先看一下几段代码: 1 //代码段1-------------------------- 2 var myvar = '变量值'; 3 co…
基础知识  在这个课题开始之前我们先做一些基础知识的讲解 1.在顶级的区域内声明的变量为 window级别的变量. 也就是说var a=100 等价于 window.a=100; 2.局部的重新声明变量没有意义.var a=100;var a;后面的将没有意义. 3.在有参数函数的定义中 function abc(p1){} abc(1),在函数执行中,先构建,在执行,会有两个步骤,所以说当函数执行之前构建过程中,将临时生成代码 var p1=1;将来一切不赋值的声明将变得没有意义. var p…
Q首先一道题 if(false){ var a = 1; } console.log(a); //undefined //我以为输出ReferenceError: aa is not defined //但是实际输出undefined //因为js没有块级作用域,所以最后代码就成了这样 var a; if(false){ a = 1; } console.log(a); 上面是一个引子 js没有块级作用域 <1>  let和const声明的变量只在let命令所在的代码块内有效 在代码块外引用l…
一.变量提升是指将变量声明提升到它所在作用域的最开始部分 console.log(a) // 为什么会出现以上的结果,是因为js的变量提升,将a变量的声明提升到全局作用域的最上面部分,实际代码如下: var a; console.log(a) a = 1; console.log(a) 二.函数提升是指将函数声明提升到它所在作用域的最开始部分 备注:js创建函数有两种方式,一种是函数声明和函数表达式,只有函数声明才存在函数提升 var fn = function() { console.log(…
一.引入 在了解这个知识点之前,我们先来看看下面的代码,控制台都会输出什么 var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); 小白理解:foo是一个全局变量,值为1,当执行bar函数的时候,对1取反的结果是false,不会执行bar函数内部的if语句,所以弹出1 小炉:不不不,你并不知道变量提升和函数提升,请看下面正确的代码执行过程 var foo;foo = 1 function bar…
今天遇到了一个问题,抽象出来的代码如下: var zoom=13; function setZoom(){ zoom=14; } function displayZoom(){ this.setZoom(); alert(zoom); var zoom=1500; this.changeZoom(); alert(zoom); } function changeZoom(){ this.zoom=++zoom; } 执行结果 ……………………………………………… ………………………… ………………
变量,作为编程语言最基础的部分,每种语言的变量不尽相同,但又大径相庭.大部分编程语言的变量有块级作用域,如if.for.while... 但JavaScript不纯在块级作用域,而是函数作用域,并且有自己独有的特性--变量提升.(ES6新添加的let.const使其可以用块级作用域) 对于函数的变量访问时遵循作用域链的,即当前函数运行时会有一个当前作用域,当饮用某个变量时,会先查找当前作用域内是否存在该变量的定义,如果不存在则根据作用域链向上去查找父函数的作用域,有则拿来使用,没有则继续向上直到…
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp73   一.变量的类型  Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量.例如: i=100;//Number类型 i="variable";//String类型 i={x:4};//Object类型 i=[1,2,3];//Arra…
一.变量的类型  Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量.例如: i=100;//Number类型 i="variable";//String类型 i={x:4};//Object类型 i=[1,2,3];//Array类型 JS的这种特性虽然让我们的编码更加灵活,但也带来了一个弊端,不利于Debug,编译器的弱检测让我们维护冗长的代码时相当痛苦. 二…
原文网址:http://www.cnblogs.com/betarabbit/archive/2012/01/28/2330446.html 这是一篇作者翻译过来的文章,未翻译的原文网址在这里:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html 你知道下面的JavaScript代码执行后会alert出什么值吗? 1: var foo = 1; 2: function bar() { 3: if (!foo) { 4…
今天在知乎看前端面试题的时候,看到这样的问题,发现自己懂的真的是太少了,看了给的例子,所以写一下自己的理解. 首先放一段代码: var v= “hello JavaScript”; alert(v); 很明显,这样的是会弹出对话框: 将alert(v)写到一个函数中: var v= “hello JavaScript”; function test(){ alert(v); }; test(); 这样弹出的结果肯定也是和第一个一样:那么下面这种方式输出的结果是什么? var bar=1; fun…
条件函数变量提示于全局中函数变量提升不一样. 条件中: 函数变量提升, 只是声明(现新版本浏览器中) if(g()){ function g() { return true } console.log(1); } 条件中: 函数变量提升, 声明+定义 f() function f() { console.log(1); }…
JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部: 'use strict'; function foo() { var x = 'Hello, ' + y; alert(x); var y = 'Bob'; } foo(); 虽然是strict模式,但语句var x = 'Hello, ' + y;并不报错,原因是变量y在稍后申明了.但是alert显示Hello, undefined,说明变量y的值为undefined.这正是因为JavaS…
var i = 2,    x = 5;var fn = function (x) {    x += 3;    return function (y) {        console.log((x++) + y + (--i));    }};var f = fn(1);f(2);fn(3)(4);f(5); 答案:f(2) => 7;     fn(3)(4) => 10;    f(5) =>9; 解题思路: 1. var f = fn(1);相当于开了一个堆内存(私有作用域)…
var:变量提升(无论声明在何处,都会被提至其所在作用域的顶部) let:无变量提升(所在的块内,未到let声明时(即let声明之前),是无法访问该变量的(not defined)),let变量不能重复声明(报错has already been declared) const:无变量提升,声明一个基本类型的时候为常量,不可修改:声明对象可以修改 <script> var a = 1; function fn() { console.log(a)//undefined a = 2; consol…
js变量提升 对于大多数js开发者来说,变量提升可以说是一个非常常见的问题,但是可能很多人对其不是特别的了解.所以在此,我想来讲一讲. 先从一个简单的例子来入门: a = 2; var a; console.log(a); 你觉得以上的代码会输出什么?是输出undefined吗?如果是按照程序的自上而下执行的话,那么这一段代码确实是输出undefined.然而,javascript并不是严格的自上而下执行的语言. 这一段代码的输出结果是2,是不是感到很意外?为什么会这样呢?这个问题的关键就在于变…
javascript不仅仅是一门弱类型语言,还是一门解释型语言.一门编程语言的本质就是这样,优点即是缺点,缺点也往往是优点.JS因为有了变量提升,能够使我们在编程时可以忽略“先声明,再使用”的规则,但也正是JS变量提升的存在,使得我们编程时一不留神就掉进了陷阱. 先来看一段代码: a="test"; var a; console.log(a); 按理说应该输出Undefined,但是结果却是:“test”. 实际上js代码在执行的整个过程中是有所谓的编译期,只不过这个编译期很短暂,但却…
1.首先理解函数作用域 在JavaScript中,变量的定义并不是以代码块作为作用域的,而是以函数作用作用域的.也就是说,如果变量是在某个函数中定义的,那么它在函数以外的地方是不可见的.而如果该变量是定义在if 或者for这样的代码块中,它在代码块之外是可见的.另外,在JavaScript中,术语"全局变量"指的是定义在所有函数之外的变量,与之相对的是"局部变量",所指的是在某个函数中的变量.其中,函数内的代码可以像访问自己的局部变量那样访问全局变量,反之则不行.…
变量提升:在JavaScript中,页面加载时,会将用var声明的变量提升到作用域的最前端,只能提升声明,不能提升赋值 如果变量先赋值再使用,可以省略关键字var 如果先使用变量,再赋值,不可以省略关键字var a='hello'; console.log(a); // var a; a=10; function add(){ console.log(b); var b; } add();…