基本类型和引用类型

  • 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属性的时候,在外面也有反应。

作用域

  1. script:全局变量、全局函数
  2. 函数:自上而下、由里到外

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 变量、作用域和内存问题的更多相关文章

  1. js 变量 作用域及内存

    由于Javascript是松散型的,所以其变量只是在特定时间用于保存特定值的一个名字而已,并不存在某个变量必须保存某种类型的值的规则,变量的值以及其数据类型都可以在脚本的声明周期内改变 一.基本类型与 ...

  2. 第一百零六节,JavaScript变量作用域及内存

    JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...

  3. [刘阳Java]_步步窥探JS变量作用域

    今天的这个文章题目名称甚是让人会突发异想.JS变量作用域是务必需要搞懂的,单从面试过程就会让面试者烧脑壳.所以,我们还是写一篇关于JS变量作用域的技术专题,让所有小伙伴能够借此文章去整理JS的基础学习 ...

  4. javaScript的闭包 js变量作用域

    js的闭包 js的变量作用域: var a=90; //定义一个全局变量 function test(){ a=123; //使用外层的 a变量 } test(); document.write(&q ...

  5. 浅谈javascript中变量作用域和内存(2)

    1.无块级作用域 javascript没有块级作用域,这会让其他程序员在理解js代码上很痛苦.在其他很多语言,比如C,大括号括起来的代码块都有自己的作用域 举个例子 if(true) { var na ...

  6. 原型模式故事链(5)--JS变量作用域、作用域链、闭包

    上一章 JS执行上下文.变量提升.函数声明 传送门:https://segmentfault.com/a/11... 本次我们主要讲讲变量作用域和闭包变量作用域:顾名思义:变量起作用的范围.变量分为全 ...

  7. 解释JS变量作用域的范例

    JS的变量作用域只有两种:全局作用域与函数作用域. 用var声明的变量不能简单的说是属于函数作用域,应该是说属于其最近的作用域. var a = 10; function test(){ var a; ...

  8. 浅谈js变量作用域

    变量的作用域也是前端面试题常考的一个问题,掌握下面几个规律可以帮你更好的理解js的作用域. 1.作用域优先级遵循就近原则,函数内部的作用域优先级大于外部 var a=456; var b=111; f ...

  9. js变量作用域--变量提升

    1.JS作用域 在ES5中,js只有两种形式的作用域:全局作用域和函数作用域,在ES6中,新增了一个块级作用域(最近的大括号涵盖的范围),但是仅限于let方式申明的变量. 2.变量声明 var x; ...

  10. JS变量作用域与解构赋值

    用var变量是有作用域的 变量在函数内部声明时,那么该变量只属于整个函数体,函数外不可调用 当两个不同的函数里,使用了用一个相同的变量名,二者不互相影响,相互独立 遇到嵌套函数时,外部函数不可调用内部 ...

随机推荐

  1. Python之int内部功能介绍

    int内部功能的介绍 type(): 1.基本数据类型使用type()函数时,得到相应的数据类型a = 12b = 12.01c = "123"print(type(a)) > ...

  2. 软件测试管理QC

    一.QC简介 1)是HP公司的产品,是B/S结构的产品 2)在QC服务器中,打开IE浏览器,在地址栏中输入QC服务器的网址或者IP地址. 查看虚拟机的IP地址: 本地连接-属性-TCP/IP协议(重点 ...

  3. 微信小程序爬坑日记

    新公司上手小程序.30天,从入门到现在,还没放弃... 虽然小程序发布出来快一年了,爬坑的兄弟们大多把坑都踩平了.而我一直停留在"Hello World"的学习阶段.一来没项目,只 ...

  4. (译)ABP之依赖注入

    原文地址:https://aspnetboilerplate.com/Pages/Documents/Dependency-Injection 什么是依赖注入 传统方式的问题 解决方案 构造函数注入 ...

  5. Tosska SQL Tuning Expert 工具优化SQL语句

    对于SQL开发人员和DBA来说,根据业务需求写出一条正确的SQL很容易.但是SQL的执行性能怎么样呢?能优化一下跑得更快吗?如果不是资深的DBA,估计很多人都没有信心. 幸运的是,自动化优化工具可以帮 ...

  6. Android Studio问题汇总

    1) Android Studio重命名工程名称: 1. 关闭Android Studio 2. 修改project所在路径的文件夹名字为[NewName] 3. 修改根目录下的.iml文件名为[Ne ...

  7. 在学java继承中

    看到一片个人认为的好博客,http://www.cnblogs.com/dolphin0520/p/3803432.html   ;这一节看的比较慢,加油,就是干: 分类不好意思分到Java中,嘿嘿还 ...

  8. loadrunner 录制TCP协议脚本操作

    测试TCP协议的项目,涉及到登陆.发送实时数据.指令.登出等,直接写报文工作量太大,所以需要录制报文. 操作方法如下: 1.启动服务端程序 2.使用winsocket协议 3.选择应用程序 4.录制选 ...

  9. 掌上快递 APP 项目之概述篇

    概述 学习Android开发也有一段时间了,利用业余时间独立制作的一款快递类APP软件.大概2个多星期吧,自己将其定位为"集快递信息追踪.附近快递点查询. 快递公司投诉功能为一体的便民生活类 ...

  10. CSS3实现的一批hover特效

    本特效的原版是codepen上面的hover.css项目.个人非常喜欢所以把全部的hover特效自己也写了一遍,上传文件麻烦所以直接把css整合到HTML代码中了.代码复制下来保存后就可以用浏览器打开 ...