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变量是有作用域的 变量在函数内部声明时,那么该变量只属于整个函数体,函数外不可调用 当两个不同的函数里,使用了用一个相同的变量名,二者不互相影响,相互独立 遇到嵌套函数时,外部函数不可调用内部 ...
随机推荐
- 已有模板与tp框架结合
具体实现步骤: ①复制模板文件到view指定文件目录: ②复制css.js.img到view指定文件目录: ③把静态资源(css.js.img)文件的路径设置为“常量”信息(在index.php入口文 ...
- PHP就业前景好不好一看便知,转行选择需谨慎!
随着互联网行业迎来新一波的热潮,更多的年轻人选择软件行业发展.由于互联网本身快速发展.不断创新的特点,决定了只有以快开发速度和低成本,才能赢得胜利,才能始终保持网站的领先性和吸引更多的网民. 互联网的 ...
- PHP入门怎么选?大学生适合学习吗?
大学毕业,面对竞争激烈的社会,理想总是很丰满,现实却很残酷.在硕士.博士都随处可见的今天,本科和大专文凭就显得苍白无力,在面试官问你"有没有工作经验"的时候,你是不是只想起实习期间 ...
- yii2.0中添加二维数组,多条数据。
/** * @inheritdoc 批量添加 * @params $add array 添加数据 */public function add_all($add){ $connection = \Yii ...
- Mysql 的 IF 判断
mysql自带很多判断逻辑,今天说一说IF的判断语句,正好今天做项目的时候也用到了 1. IF 判断 IF判断和我们代码里面写的有略微的差别,举个例子 IF('表达式','结果1','结果2') 如 ...
- calc() ---一个会计算的css属性
最近这个月一直在赶项目开发,遇到的问题和学到的前端知识没有更新到博客园,现在闲了下来,就整理一下前端知识. 在项目开发中,在样式这方面花费的时间较多,因为针对于数字的变化特别多,本人不爱记数字,在看设 ...
- vue init失败解决方案-终极版
//由于windows系统的某方面问题,vue脚手架安装可能会出现第一证书丢失 // 报错:vue-cli · Failed to download repo vuejs-templates/webp ...
- 》》css3--动画
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 【剑指Offer学习】【面试题21:包括min 函数的栈】
题目: 定义栈的数据结构,请在该类型中实现一个可以得到栈的最小素的min 函数.在该栈中.调用min.push 及pop的时间复杂度都是0(1) 解题思路: 把每次的最小元素(之前的最小元素和新压入战 ...
- Spark Shuffle模块——Suffle Read过程分析
在阅读本文之前.请先阅读Spark Sort Based Shuffle内存分析 Spark Shuffle Read调用栈例如以下: 1. org.apache.spark.rdd.Shuffled ...