04 变量,作用域,内存

开头

这一章主要讲了3个问题

  1. 变量
  2. 类型判断
  3. 作用域

变量。



基础类型 & 引用类型。

基础类型 在栈里面。
引用类型 站里面放个地址,堆里面放实际内容。

感觉像 .net 值类型和引用类型.

引申出来的问题就是。

引用类型 基础类型复制的问题.

理论上复制都是在 上面.

值类型 都是在 上. 所以每次复制都新的.

 var i = 0;
var ii = i;
ii = 1;
console.log(i);
console.log(ii);

结果 自然是 0 & 1.

引用类型 他在桟上只是一个引用. 实际内容却是 堆内存上.

所以 你复制 引用类型的时候,只是复制了一个引用。 实际上,你们指向的是同一个地址.

var o = { a: 1 };
var o1 = o;
o1.a = 2;
console.log(o.a);
console.log(o1.a);

结果 2,2.

就是这样。

貌似有种说法叫做 深复制 & 潜复制

就是针对引用类型.

潜复制 就是刚才那种简单的复制。引用地址还是一样。

深复制 就是在堆内存的数据都复制一份,变成两个完全独立的个体

书中深入了一下,function 参数问题

var o = {
    a: ‘test‘
}

function a(obj)
{
    obj.a = ‘test1‘;
}

a(o);

console.log(o);

参数传递 其实就是相当于一次 潜复制

如果参数是引用类型,里面做出修改在外部调用的时候。是会改变的.

类型判断



以前一般使用 typeOf 然后会得到类型

console.log(typeof(‘sadasd‘))
console.log(typeof({}))
console.log(typeof(function(){}))
console.log(typeof([]))
console.log(typeof(1));
console.log(typeof(NaN));
console.log(typeof(Number.MIN_VALUE));
console.log(typeof(Infinity));
console.log(typeof("123"));
console.log(typeof(true));
console.log(typeof(window));
console.log(typeof(document));
console.log(typeof(null));
console.log(typeof(eval));
console.log(typeof(Date));
console.log(typeof(sss));
console.log(typeof(undefined));

string

object

function

object

number

number

number

number

string

boolean

object

object

object

function

function

undefined

undefined

各种. 主要问题还是 太多object

array 是个 object。

object 是 object.

null 是个 object.

解决这个问题有两种办法.

  1. 用只有他的属性.

比如 Array。 push方法

if(o.push)

这样就可以判断.

还可以使用 instanceof

if(o instanceof Array)

if(o instanceof RegExp)

就可以了.

作用域



他说了2个概念.

1 执行环境.

首先有一个全局环境 window

其他都是局部环境.

有一个环境桟这个概念。 进入一个函数时,会将这个函数的环境 push 到环境桟中。

执行完 弹出。 并且销毁 这个函数的环境以及变量.

而window是始终存在,知道网页关闭,浏览器关闭之类的.

2 作用域链

这个比较简单。

每一个函数的执行 会有一个作用域的链。

其中有自身变量,和外部环境。

外部环境也是同样的。

就形成了 这样一级一级的 链条.

上级不能访问下级。 最底层访问所有。的关系.

来个例子.

var a = 1;
function funca()
{
    var b = 2;

    function funcb() {
        var c = 3;
    }
    funcb();
}
funca();

例子很简单,但是还是能说明问题。

都是先查找自己的环境内部变量,然后找外部。

在后面他提到了。 延长作用域和块级作用域.

他说可以用 try catch & with 来延长作用域

function test1()
{
    var qs = "?debug=true"

    with(location)
    {
        var url  = href +qs;
    }

    return url;
}

function test2() {
    try {
        var aaa = "aa";
    } catch (e) {

    }

    return aaa;
}

这两个都能在 {} 外部访问里面声明的变量. 书中说这是延长了作用域。

可是我觉得 这个是 JavaScript 没有块级作用域导致的.

比如

if(xxx)
{
    var a = 0;
}

这个 a 在 { } 以外是能够访问的。 因为 JavaScript 是没有块级作用域的。

他和 {} 以外是一个作用域. 所以你能够访问.

我觉得 with & try catch 是一个道理.

时间: 2024-10-25 00:29:24

04 变量,作用域,内存的相关文章

js变量作用域内存

基本数据类型: undefined;null;boolean;number;string这五种基本类型是按值访问的,因为可以操作保存在变量中的实际的值 引用数据类型:object引用数据类型是保存在内存中的对象,javascript不允许直接访问内存中的位置,也就是不能直接操作对象的内存空间,在操作对象时,实际操作的是对象的引用,而不是实际的对象(这种说法其实是不严谨的,当复制保存着对象的某个变量时,操作的是对象的引用.但是为对象添加属性时,操作的是实际的对象) 参数传递:javascript中

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

JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变. 一.变量及作用域 1.基本类型和引用类型的值 ECMAScript变量可能包含两种不同的数据类型的值:基本类型值和引用类型值.基本类型值指的是那些保存在栈

javascript变量作用域与内存

第四章 变量作用域与内存基本类型 5种Undefined Null Boolean Number String 两种变量类型 基本类型与引用类型注意:String 再其他语言中是引用类型,再javascri中为基本类型即:这五种基本类型是按值访问的 引用类型是按照引用访问的 动态的属性对于一个引用类型,一个引用变量被赋值后,可以为其添加属性,也可以删除与修改其属性var o = new object();o.name = "qi"; //可以为引用变量添加属性 变量的复制基本类型的复制

JavaScript变量作用域和内存问题(js高级程序设计总结)

1,变量 ECMAScript和JavaScript是等同的吗?个人认为是否定的.我的理解是这样的,ECMAScript是一套完整的标准或者说协议,而JavaScript是在浏览器上实现的一套脚本语言.也就是说,ECMAScript是JavaScript的父类标准.JavaScript是ECMAScript的具体实现.所有ECMAScript定义的数据类型或者语言特性实际上都是伪代码的形式规定的.当然如果可以,ECMAScript也可以有服务器实现,单片机实现(不一定恰当).如果说ECMAScr

PHP笔记 变量和内存管理

鸟哥的博客是个大宝库,正在从头看起. <深入理解PHP内存管理之谁动了我的内存> http://www.laruence.com/2011/03/04/1894.html 1.memory_get_usage 函数 int memory_get_usage ([ bool $real_usage = false ] ) PHP脚本使用的内存(不含 memory_get_usage() 函数本身占用的内存) memory_get_usage()的参数$real_usage,默认为 FALSE:当

JavaScript基础之函数和变量作用域

函数:封装一项任务的步骤清单的代码段,再起一个名字 ( js中函数也是一个引用类型的对象,函数名其实也是引用函数对象的普通变量.) 函数对象:内存中专门存储一个函数定义的存储空间 函数定义的存储位置在window之外. 何时使用:一项任务可能反复使用时,就仅需要在函数中封装一次,反复调用函数即可. 如何声明函数: function 函数名([参数1,参数2,...]){ 步骤清单 return 返回值 } 参数:专门接受函数调用时,必要数据的变量 如何使用参数:在函数内,参数变量的使用和普通变量

C语言-数据类型、常量、变量、变量作用域、printf、scanf函数

4.数据类型介绍 数据:文本数据.音频.视频.图像.数字 C语言中有5大数据类型:基本类型.构造类型.空类型.指针类型.自定义类型 基本数据类型: 整型    长整型long int    整型int(4)    端整型short int 实型    单精度float(4)    双精度 double(8) 字符型   char(1) 内存: 1> 内存分配:4G存储大小:4*1024*1024*1024Byte; 内存的基本单元为一个字节(就是8bit) 2> 内存区域:栈 (存放局部变量)

Java变量以及内存分配

Java变量以及内存分配(非常重要) 堆栈 静态存储区域 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收.注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 3.全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的

简洁的三元表达式,swicth-case,变量作用域与程序调试

 直接进入主题! 1. 三元表达式: 由3个数据参与的表达式.二元表达式: 算术表达式 一元表达式: 自增自减.  2. 三元表达式的语法: bool表达式?值1:值2; int i = 10;  i > 0 ? 100 : 200; 3. 三元表达式的结果. 如果bool表达式的结果为true 那么这个三元表达式的结果就为值1; 如果bool表达式的结果为false 那么这个三元表达式的结果就为值2; 三元表达式的结果的类型和值1.值2的类型一致. 4. 三元表达式中的 值1和值2的类型要求一

Objective-C之成魔之路【9-类构造方法和成员变量作用域、以及变量】

重开发者的劳动成果,请勿转载 构造方法 出于初始化类中的成员变量的需要, 可以提供一个方法用于此目的, 这个方法就叫构造方法或构造方法(Constructor). 与C++和Java不同, Objective-C命名是没有限制的, 并且有返回值本身类型指针. 以音乐类举例: Song.h文件 @interface Song : NSObject { NSString *title; NSString *artist; long int duration; } //操作方法 - (void)sta