js作用域的几个问题
按照《权威指南》的说法,全局的变量作用域是全局性的,在js代码中,他处处都有定义。而在函数之内声明的变量,就只有在函数体内有定义了。函数的参数也是局部变量,他们只在函数体内部有定义。在函数体内部,局部变量的优先级比同名的全局变量高。如果给一个局部变量或函数的参数声明的名字与全局变量的名字相同,那么就有效地隐藏了这个全局变量。
js没有块级作用域,,函数中声明的所有变量,无论在哪里,如for ,if等,在整个函数中他们都是有定义的。这个也叫变量提升,作用域都是在函数中。
1,对象内部的作用
- var a = 10;
- var AAA = function (){
- console.log(this.a);
- }
- var b = {a:2,bbb:AAA};
- b.bbb();
最后输出的是2,this指向的自己的对象。this需要牢记的是 他是自己的对象的范围。点之前的作用域,是b所以bbb()执行的是b的作用域。事实是,在方法调用中是由调用表达式自身来确定this变量的绑定。。通常,通过某个对象调用方法将查找改方法并将该对象座位该方法的接受者。
2,对象共享的问题
- var cat ={};
- cat.mouse = function(){var b="1111"};
- var dog = cat;
- console.log(dog);
- console.log(dog.mouse);
- dog.mouse = function(){var b="2222"};
- dog.hat="b";
- console.log(cat)
- Object {mouse: function}
- hat: "b"
- mouse: function (){var b="2222"}
- __proto__: Object
- function (){var b="1111"}
- Object {mouse: function, hat: "b"}
- hat: "b"
- mouse: function (){var b="2222"}
- __proto__: Object
对象赋值后,指向了同一个对象,及时改变的是第二个对象,第一个对象也跟着变。conosle.log 看到是最后结果了。引用同一个对象,大家一起变。
3,
- var test=function(){
- var a=1;
- setTimeout(function(){
- console.log(a);
- a=2;
- },1000);
- a=3;
- setTimeout(function(){
- console.log(a);
- a=4;
- },2000);
- };
- test();
结果是3,2;
共享内存。setTimeout等异步,是取现在当时的a的值。执行第一个setTimeout的时候,a=3,已经执行了。全局的对象,同一个引用。外部变量不仅可以被访问到也可以被修改。
4,
- var foo=10;
- var a=1;
- var main = function (){
- //a=10;
- console.log(a);
- a=20;
- console.log(this.foo);
- this.foo=foo;
- console.log(this.foo);
- foo=1000;
- console.log("111111111111");
- }
- var s=main();
- var d=new main();
结果是:
1
10
10
111111111111
20
undefined
1000
111111111111
不加new 都是全局的,this指向的全局变量。所以第一个就取得是全局的值。
第二个加new 了,this.foo指向的是自己,没有定义于是就报undefined。外面a foo等是全局变量,main(),执行后,a已经变成20了,foo也变成1000了,所以值发生变化了,因为全局变量。
- var foo=10;
- var a=1;
- var main = function (){
- //a=10;
- console.log(a);
- a=20;
- console.log(this.foo);
- this.foo=foo;
- console.log(this.foo);
- foo=1000;
- console.log("111111111111");
- }
- //var s=main();
- var d=new main();
如果不执行第一个,结果发生变化。可以发现其实是全局变量的修改。
1
undefined
10
111111111111
5、
- var a = 10;
- var b = function(){
- console.log(this.a);
- }
- var c = function(){
- this.a = 123;
- var d = b;
- d();
- }
- var e = new c;
console.log(window.a);
- var a = 10;
- var c = function(){
- this.a = 123;
- var d = function(){
- console.log(this.a);
- };
- d();
- }
- var e = new c;
结果是10。 window.a其实就是全局的那个a。this指的是在一个函数内部调用它的上下文关系,单独的一个函数了。var d单独的一个函数,他的this.a指向的是全局的了,没有作用域,就是全局了。
- var a = 10;
- var b = function(){
- console.log(this.a);
- }
- var c = function(){
- this.a = 123;
- this.d = b;
- this.d();
- }
- var e = new c;
结果是123,如果this.d(),写成d(),会报错 d is not defined。 this.d 将d的后面的this变成了c这个函数了。点执行方法,作用域是点之前的。
- var a = 10;
- var c = function(){
- this.a = 123;
- this.d = function(){
- console.log(a);
- };
- this.d();
- }
- var e = new c;
结果是10。
- var a = "aaaa";
- var c = function(){
- this.a = "bbbb";
- this.d = function(){
- console.log(a);
- };
- // this.d();
- }
- var e = new c();
- console.log(e.d())
结果是:
- aaaa
- undefined
在 JavaScript 中,上下文对象就是 this 指针,即被调用函数所处的环境。上下文对象 的作用是在一个函数内部引用调用它的对象本身。
在 JavaScript 中,本质上,函数类型的变量是指向这个函数实体的一个引用,在引用之 间赋值不会对对象产生复制行为。我们可以通过函数的任何一个引用调用这个函数,不同之处仅仅在于上下文。
仔细观察上面的例子,使用不同的引用来调用同一个函数时,this 指针永远是这个引用所属的对象.
函数作用域的嵌套关系是定义时决定的,而不是调用时决定的,也就 是说,JavaScript 的作用域是静态作用域,又叫词法作用域,这是因为作用域的嵌套关系可 以在语法分析时确定,而不必等到运行时确定
基础类型是通过传值来操作,而引用类型则是通过传址来操作的
数字和布尔类型是基础类型,因为它们是由很小的,固定数目字节组成。
对象是引用类型。数组和函数,是对象的特殊类型,也是引用类型。由于对象的没有固定大小,所以无法通过传值。
需要注意的是,如果函数用新的一个对象或者数组覆盖这个引用,那么这一修改在外部是不可见的。或者说,对象和数组是用传值的方式来传递的,只不过这个值是一个引用,而不是本身。
参考 http://www.cnblogs.com/joe2014/archive/2014/06/28/3813919.html
字符串类型
前面看了这么多类型,一直都没有介绍字符串类型,它不好直接分为基础类型和引用类型,因为字符串是一种任意的长度,看上去应该是引用类型,可是他却不是对象,所以也不可作为引用类型。
类型 |
复制 |
传递 |
比较 |
数字 | 传值 | 传值 | 传值 |
布尔 | 传值 | 传值 | 传值 |
字符串 | 不可变 | 不可变 | 传值 |
对象 | 传址 | 传址 |
传址 |
参考:http://www.cnblogs.com/bennman/archive/2013/09/08/3309024.html
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是使用变量. 如果在函数内使 ...
随机推荐
- 164 Maximum Gap 最大间距
给定一个无序的数组,找出数组在排序后相邻的元素之间最大的差值.尽量尝试在线性时间和空间复杂度情况下解决此问题.若数组元素个数少于2,则返回0.假定所有的元素都是非负整数且范围在32位有符号整数范围内. ...
- Spring------自动化装配Bean(二)
上一篇是基于 @ComponentScan自动装配Bean的实现,这一篇将通过java手动装配bean来实现. 手动装配相对于自动装配的优点: 可以自行定义Bean的各个属性. 添加额外的方法调度. ...
- DataTable数据导入DataBase
EXcel---->DataTable--->DataBase /// <summary> /// Excel数据-->DataTable导入DataBase /// & ...
- 使用css3 制作switch开关
使用css3来实现switch开关的效果: html代码: <!--switch开关--><div class="switch-btn"> <inpu ...
- python的与或非运算
真的很重要,栽了个跟头!!!(虽然以前好像知道...) print(True or False and False) print((True or False) and False) # True # ...
- Web前端开发学习误区,你掉进去了没?
从接触网站开发以来到现在,已经有五个年头了吧,今天偶然整理电脑资料看到当时为参加系里面一个比赛而做的第一个网站时,勾起了在这网站开发道路上的一串串回忆,成功与喜悦.烦恼与纠结都历历在目,感慨颇多. 先 ...
- vmware桥接模式下主机有多个网卡导致虚拟机网络不通
桥接模式下,vmware会绑定一个物理网卡,因此有多个物理网卡时就要注意当前绑定的物理网卡.打开如下vmware菜单 可以看到VMnet0是桥接模式用的,然后他可以选择绑定一个物理网卡,注意要正确选择 ...
- SqlServer 2008 创建测试数据
包含要点: 数据库的循环 . insert select 句式 . 随机数(rand()函数).绝对值(abs()函数) ) ) DECLARE @randomvalue float SET @s ...
- nvm、npm、nodejs的关系(转载)
nvm.npm.nodejs的关系 为什么要了解nvm.npm.nodejs的关系: reactNative的项目构建都是有这几个工具进行构建管理. 掌握他们的关系,就能了解reactNative项目 ...
- COM(Component Object Model)接口定义
a COM interface is defined using a language called Interface Definition Language (IDL). The IDL file ...