JS-JS作用域问题
一、 js没有块级作用域(可以自己闭包或其他方法实现),只有函数级作用域,函数外面的变量函数里面可以找到,函数里面的变量外面找不到。
var a=10;
function fn(){
console.log(a); //
}
function fn1(){
var a=20;
fn();
}
fn1();
程序执行过程:
step-1:调用 fn1()
step-2:执行fn1(),声明局部变量a=2 ;调用 fn()
step-3:执行fn(),fn()中的a是全局变量,所以打印10
二、没有var直接赋值的变量都属于全局变量,即使在函数内部。
function fn(){
var a=b=10;
}
fn();
console.log(b);//
console.log(a);//Uncaught ReferenceError: a is not defined
var a=b=10 相当于 b=10;var a=b; 这种写法在函数内,b是全局变量,a是局部变量。执行完fn(),在console.log(b),会弹出10,在console.log(a)会报错。
三、 变量的查找是就近原则,去寻找var定义的变量,当就近没有找到的时候就去查找外层。
var a=10;
function fn(){
var a=20;
console.log(a);//
}
fn();
四、变量预解析
var a=10;
function fn(){
console.log(a);//undefined
var a=20;
}
fn();
所谓的预解析就是:在当前作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义。
函数fn()的执行过程为:
step-1:var a
step-2:console.log(a)
step-3:a=10
当执行到console.log(a)时,还没有给局部变量a赋值,所以是undefined。
五、当参数跟局部变量重名时,优先级是等同的。
var a=10;
function fn(a){
console.log(a);//
var a=20;
}
fn(a);
六、指向同一地址的两个引用类型的变量,变量修改的时候另一个变量会跟着变化,但是当变量重新被赋值时,则另一个不变化。
var a=[0,1,2];
var b=a;
b[3]=3;//变量b被修改,a也跟着修改
console.log(a);//[0,1,2,3]
var a=[0,1,2];
var b=a;
b=[0,1,2,3];// 变量b被重新赋值,a不变化
console.log(a);//[0,1,2]
原因:
b重新赋值后,已经不指向a的地址了
七、传参时,基本类型传值,引用类型传引用。(但是重新赋值之后就不是这样了喔,原因见第六条)。
var a=10;
function fn(a){
a+=10;
}
fn(a);
console.log(a);//
按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。
var a=[0,1,2];
function fn(a){
a[3]=3;
}
fn(a);
console.log(a);//[0,1,2,3]
按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
var a=[0,1,2];
function fn(a){
a=[0,1,2,3];
}
fn(a);
console.log(a);//[0,1,2]
函数内部给a重新赋值后,已经不指向原始值a的地址了。
JS-JS作用域问题的更多相关文章
- JS 之作用域链和闭包
1.JS无块级作用域 <script> function Main(){ if (1==1){ var name = "alex"; } console.log(nam ...
- js词法作用域规则
function foo() {console.log( a ); // 2不是3} function bar() {var a = 3;foo();} var a = 2;bar(); js中的作用 ...
- js词法作用域
作用域链和原型链是JS中比较重要的2个概念, JS的是函数作用域,与C之类语言的块级作用域不同 JS的作用域还是词法作用域,或者叫静态作用域,作用域链是在语法解析时就完成的,而不是在执行时创建. 例子 ...
- 浅谈 js eval作用域
原文:浅谈 js eval作用域 就简单聊下如何全局 eval 一个代码. var x = 1; (function () { eval('var x = 123;'); })(); console. ...
- JS的作用域浅谈
作为前端小白,总是对JS的作用域有点迷糊,这里稍微研究了一下分享出来,希望和我一样的小白可以学的一点 首先是一个经典的例子: var a=0,b=0; for (var i = 0; i < 1 ...
- JS 函数作用域及变量提升那些事!
虽然看了多次js函数作用域及变量提升的理论知识,但小编也是一知半解~ 这几天做了几道js小题,对这部分进行了从新的理解,还是有所收获的~ 主要参考书籍: <你不知道的JavaScript(上卷) ...
- js私有作用域(function(){})(); 模仿块级作用域
摘自:http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.phpvar.com%2Farchives%2F3033.html js没有块级作用域,简单的例子: f ...
- 浅谈js变量作用域
变量的作用域也是前端面试题常考的一个问题,掌握下面几个规律可以帮你更好的理解js的作用域. 1.作用域优先级遵循就近原则,函数内部的作用域优先级大于外部 var a=456; var b=111; f ...
- 再谈js的作用域
再谈js的作用域 面试中遇到的题目: 题目一: var word = "hello world"; (function(){ alert(word); var word = ...
- js变量作用域--变量提升
1.JS作用域 在ES5中,js只有两种形式的作用域:全局作用域和函数作用域,在ES6中,新增了一个块级作用域(最近的大括号涵盖的范围),但是仅限于let方式申明的变量. 2.变量声明 var x; ...
随机推荐
- javascript arguments参数问题
function f(a, b, c){ alert(arguments.length); // result: "2" a = 100; alert(arguments[0]); ...
- Linux 学习笔记之超详细基础linux命令 Part 13
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 12---------------- ...
- Kotlin入门(6)条件分支的实现
上一篇文章介绍了字符串的相关操作,其中示例代码用到了if和for语句,表面上看,Kotlin对控制语句的处理与Java很像,可实际上,Kotlin在这方面做了不少的改进,所以本篇和下一篇文章就分别介绍 ...
- android开发笔记:Handler、Looper、MessageQueen、Message的关系
一.什么是handler? 注:线程分为主线程(主线程又叫UI线程,只能有一个主线程)和子线程(可以有多个)Handler只能在主线程里运行 handler是Android给我们提供用来更新UI的一套 ...
- 2.网络编程-udp
# 使用套接字发送udp数据import socket s = socket.socket(socket.AF_INET, SOCK_DGRAM) s.sendto(b"hello" ...
- Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)
Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...
- [20170628]11g修改用户名.txt
[20170628]11g修改用户名.txt --//昨天看了链接,提到修改用户名:http://www.oratea.com/2017/06/26/oracle-11g%e4%bf%ae%e6%94 ...
- [20170622]传输表空间与dblink.txt
[20170622]传输表空间与dblink.txt --//测试看看使用dblink+传输表空间的情况.写的情况相对复杂一点,具体看测试: 1.环境:--//2个数据库版本一致.实际上在1台主机上. ...
- 纯CSS选项卡
html: <!doctype html> <html> <head> <meta charset="utf-8"> <tit ...
- Android 发送自定义广播(标准和本地)
1.首先自定义一个广播接收器:MyBroadcastReceiver package example.com.mybroadcastreceiver; import android.content.B ...