js 变量、作用域和内存问题
基本类型和引用类型
5种基本类型:undefined、null、boolean、number、string
引用类型:由多个值构成的对象
属性
引用类型可以动态添加属性,而基本类型不可以
var p = new Obj();
p.name = "huyuping";
console.log(p.name)//huyuping
var a;
a.name = "huyuping";
console.log(a,name)//出错
复制变量值
- 基本类型
会在变量的对象上创建了一个新值,然后把复制到新变量分配的位置上。
下面的我形象化的帮助大家理解
这就相当于a和b都有一个房子,a把值复制给b后,b的房子了也有了这个值。
- 引用类型
当从一个变量向另一个变量复制引用类型的值时,同时也会将存储在变量类型中的复制一份放到为新变量分配的内存空间中。
这可以这样理解:a,b都有自己的地方,a的值时放在另一个屋子里的,a复制给b,那a和b都要在哪个房子里去拿值,这个房子就是给a分配的内存,b的内存也指向哪个位置。
传递参数
- 基本类型
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数)。
unction addTen(num) {
num+=10;
return num;
}
var count = 20;
var result = addTen(count);
console.log(count);//20
console.log(result);//30
这里函数有个局部变量num,在使用之后就被回收了,然后函数返回一个值。
我们看下面一种情况
function addTen(num) {
num+=10;
return num;
}
var count = 20;
addTen(count);
console.log(count);//20
console.log(addTen(count));//30
这次,我们没有定义result变量,而是直接输出addTen(count),输出的值还是30,这更说明了num时局部变量,不会影响count的值。
- 引用类型
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给局部变量,因此这个局部变量的变化会反映在函数外部。
function setName(obj) {
obj.name = "huyuping";
}
var person = new Object();
setName(person);
console.log(person.name);//huyuping
在这个函数内部,obj和person引用的时同一个对象,所以为obj添加name属性的时候,在外面也有反应。
作用域
- script:全局变量、全局函数
- 函数:自上而下、由里到外
e.g.1
alert(a);//undefined
var a = 1;
function fn1 () {
alert(a);//undefined
var a = 3;
}
fn1();
alert(a);//1
分析:
1.预解析:
1)a= undefined
2)fn1 = function fn1 () {alert(a);var a = 3; }(函数里的a是新定义的,所以预解析的时候会先是var a = undefined)
2.表达式:
1)a=1;
2)调用函数
1.预解析 a= undefined
2.表达式 a=3
e.g.2
alert(a);//undefined
var a = 1;
function fn1 () {
alert(a);//1
a = 3;
}
fn1();
alert(a);//2
分析:
1.预解析:
1)a= undefined
2)fn1 = function fn1 () {alert(a);var a = 3; }
2.逐行解读代码:
1)a=1;
2)调用函数
1.预解析 (没有预解析,此时返回父级作用域(从子级作用域返回到父级作用域的过程叫作用域链)) 找到a=1,改为a=2
e.g.3
alert(a);//undefined
var a = 1;
function fn1 (a) {
alert(a);//undefined
a = 3;
}
fn1();
alert(a);//1
分析:
1.预解析:
1)a= undefined
2)fn1 = function fn1 (a) {alert(a);var a = 3; }
2.逐行解读代码:
1)a=1;
2)调用函数
1.预解析
function fn1 (a) a相当与var a
a=undefined
2.逐行解读代码
a=3
e.g.4
var a = 1;
function fn1 (a) {
alert(a);//1
a = 3;
}
fn1(a);
alert(a);//1
分析:
1.预解析:
1)a= undefined
2)fn1 = function fn1 (a) {alert(a);var a = 3; }
2.逐行解读代码:
1)a=1;
2)调用函数
1.预解析 function fn1 (a) a相当与var a
因为fn1(a),相当于对a传了参数,所以function fn1 (a)相当于function fn1 (var a = 1)
2.逐行解读代码
a=3
if、for 是通透的不是作用域
注意:火狐解析不到if语句里面包着的函数体,所以尽量不要向if、for里面定义变量或函数
js 变量、作用域和内存问题的更多相关文章
- js 变量 作用域及内存
由于Javascript是松散型的,所以其变量只是在特定时间用于保存特定值的一个名字而已,并不存在某个变量必须保存某种类型的值的规则,变量的值以及其数据类型都可以在脚本的声明周期内改变 一.基本类型与 ...
- 第一百零六节,JavaScript变量作用域及内存
JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...
- [刘阳Java]_步步窥探JS变量作用域
今天的这个文章题目名称甚是让人会突发异想.JS变量作用域是务必需要搞懂的,单从面试过程就会让面试者烧脑壳.所以,我们还是写一篇关于JS变量作用域的技术专题,让所有小伙伴能够借此文章去整理JS的基础学习 ...
- javaScript的闭包 js变量作用域
js的闭包 js的变量作用域: var a=90; //定义一个全局变量 function test(){ a=123; //使用外层的 a变量 } test(); document.write(&q ...
- 浅谈javascript中变量作用域和内存(2)
1.无块级作用域 javascript没有块级作用域,这会让其他程序员在理解js代码上很痛苦.在其他很多语言,比如C,大括号括起来的代码块都有自己的作用域 举个例子 if(true) { var na ...
- 原型模式故事链(5)--JS变量作用域、作用域链、闭包
上一章 JS执行上下文.变量提升.函数声明 传送门:https://segmentfault.com/a/11... 本次我们主要讲讲变量作用域和闭包变量作用域:顾名思义:变量起作用的范围.变量分为全 ...
- 解释JS变量作用域的范例
JS的变量作用域只有两种:全局作用域与函数作用域. 用var声明的变量不能简单的说是属于函数作用域,应该是说属于其最近的作用域. var a = 10; function test(){ var a; ...
- 浅谈js变量作用域
变量的作用域也是前端面试题常考的一个问题,掌握下面几个规律可以帮你更好的理解js的作用域. 1.作用域优先级遵循就近原则,函数内部的作用域优先级大于外部 var a=456; var b=111; f ...
- js变量作用域--变量提升
1.JS作用域 在ES5中,js只有两种形式的作用域:全局作用域和函数作用域,在ES6中,新增了一个块级作用域(最近的大括号涵盖的范围),但是仅限于let方式申明的变量. 2.变量声明 var x; ...
- JS变量作用域与解构赋值
用var变量是有作用域的 变量在函数内部声明时,那么该变量只属于整个函数体,函数外不可调用 当两个不同的函数里,使用了用一个相同的变量名,二者不互相影响,相互独立 遇到嵌套函数时,外部函数不可调用内部 ...
随机推荐
- log4net使用注意事项
1配置Log4net Log4net的配置文件有几种使用方式,这里将配置log4net的部分独立出来,即关于log4net的配置独立成文件log4net.config. 1)写入Mysql log4n ...
- Angular自定义组件实现数据双向数据绑定
学过Angular的同学都知道,输入框通过[(ngModel)]实现双向数据绑定,那么自定义组件能不能实现双向数据绑定呢?答案是肯定的. Angular中,我们常常需要通过方括号[]和圆括号()实现组 ...
- QTP生成随机数字+字母
以下函数实现随机生成17位数(包括字母和数字),仍有改进的空间,可根据具体要求适当修改 Dim targetstring '调用返回函数给变量.Function过程通过函数名返回一个值 targets ...
- 【算法】字典的诞生:有序数组 PK 无序链表
参考资料 <算法(java)> — — Robert Sedgewick, Kevin Wayne <数据结构> ...
- java 后台代码调用接口
import com.jiuqu.jollykeys.common.util.JsonUtil;import java.io.UnsupportedEncodingException;import j ...
- loadrunner 录制TCP协议脚本操作
测试TCP协议的项目,涉及到登陆.发送实时数据.指令.登出等,直接写报文工作量太大,所以需要录制报文. 操作方法如下: 1.启动服务端程序 2.使用winsocket协议 3.选择应用程序 4.录制选 ...
- CvIntHaarClassifier
//定义一个宏.宏里面是指针函数 #define CV_INT_HAAR_CLASSIFIER_FIELDS() \ float (*eval)( CvIntHaarClassifier*, sum_ ...
- 体验CSDN-Markdown
文件夹 文件夹 文本格式化练习 一号标题 1一号标题 二号标题 1 11 2 列表的应用 链接 图片 脚注 表格 序列图 流程图 文本格式化练习: 斜体 斜体的文字 使用鼠标,变成斜体文字 使用键盘C ...
- 通过Graph 浏览器体验Microsoft Graph
作者:陈希章 发表于 2017年3月18日 上一篇介绍了Microsoft Graph的基本概念,接下来我们快速体验一下Microsoft Graph到底能做什么? 为了帮助开发人员直观和快速体验Mi ...
- 页面的新开页,window.open的hacker
一.window.open如何进行hack 网上看的办法很多,归根接地还是不能解决掉,只有通过a标签的target属性 $obj.click(function(){ var newTab=windo ...