4 变量、作用域和内存问题

  • 基本类型和引用类型
  • 执行环境及作用域

基本类型和引用类型

基本类型:

  • Undefined
  • Null
  • Boolean
  • Number
  • String

动态的属性

对于引用类型,可以添加/删除属性和方法,不能给基本类型添加属性。

复制变量值

基本类型是值拷贝,引用类型拷贝的是指针。

传递参数

ECMAScript中所有函数的参数都是按值传递的。


In [3]:
// golbal define function alert
if((typeof alert) === 'undefined') {
    global.alert = function(message) {
        console.log(message);
    }
}

function addTen(num) {
    num += 10;
    return num
}

function setName(obj) {
    obj.name = "ZJ";
}

var count = 20;
var result = addTen(count);
alert(count);
alert(result);

var person = new Object();
setName(person);
alert(person.name);


20
30
ZJ
Out[3]:
undefined

In [4]:
function setName(obj) {
    obj.name = "ZJ";
    obj = new Object();
    obj.name = "newZJ";
}

var person = new Object();
setName(person);
alert(person.name);


ZJ
Out[4]:
undefined

检测类型

  • 检测基本类型:typeof
  • 检测引用类型:instanceof(typeof返回的都是Object)

In [9]:
var s = "ZJ";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();

alert(typeof s);
alert(typeof b);
alert(typeof i);
alert(typeof u);
alert(typeof n);
alert(typeof o);
alert("---");
colors = new Array();
pattern = new RegExp();

alert(person instanceof Object);
alert(typeof colors);
alert(colors instanceof Array);
alert(typeof pattern);
alert(pattern instanceof RegExp);


string
boolean
number
undefined
object
object
---
true
object
true
object
true
Out[9]:
undefined

执行环境及作用域

延长作用域链

  • try-catch
  • with

没有块级作用域


In [12]:
if (true) {
    var color = "blue";
}
alert(color);

function doSomething(i) {
    ;
}

for (var i=0; i < 10; i++) {
     doSomething(i);
}
alert(i);


blue
10
Out[12]:
undefined

1.声明变量

使用var声明的变量会自动被添加到最接近的环境中。在函数内部,最接近的环境是函数的局部环境;在with语句中,最接近的环境是函数环境。如果初始化变量时没有使用var声明,该变量会自动被添加到全局变量。


In [13]:
function add(num1, num2) {
    var sum = num1 + num2;
    return sum;
}
var result = add(10, 20);
alert(sum);


ReferenceError: sum is not defined
    at evalmachine.<anonymous>:6:7
    at ContextifyScript.Script.runInThisContext (vm.js:25:33)
    at Object.exports.runInThisContext (vm.js:77:17)
    at run ([eval]:608:19)
    at onRunRequest ([eval]:379:22)
    at onMessage ([eval]:347:17)
    at emitTwo (events.js:106:13)
    at process.emit (events.js:191:7)
    at process.nextTick (internal/child_process.js:719:12)
    at _combinedTickCallback (internal/process/next_tick.js:67:7)

In [14]:
function add(num1, num2) {
    sum = num1 + num2;
    return sum;
}
var result = add(10, 20);
alert(sum);


30
Out[14]:
undefined

2.查询标识符


In [15]:
var color = "blue";
function getColor() {
    return color;
}
alert(getColor());


blue
Out[15]:
undefined

In [16]:
var color = "blue";
function getColor() {
    var color = "red";
    return color;
}
alert(getColor());


red
Out[16]:
undefined

In [ ]: