javascript的对象和变量之间的区分

JavaScript020

javascript的对象和变量之间的区分,第1张

0, JavaScript的变量有几种类型: number, string, boolean, function, object, 对象就是变量的一种类型.

1,var request = createRequest()

我可以吧request当作一个变量,由createRequest方法来赋值;

这个说法有歧义, 不是由方法对变量赋值, 而是使用createRequest的返回值为变量赋值.

2, 我也可以把它当作一个object,于是request.xxx可以访问createRequest方法里面的xxx。

这个理解是错的, 从外部不能访问到方法内部定义的变量. 有一种特殊的情况:

function closure(){

var a = 1

return function() {

return a++

}

}

var fn = closure()

alert(fn())//1

alert(fn())//2函数内部的变量被改变了

这个是JavaScript的闭包机制, 可以在方法外部修改方法的内部变更量. 类似于.Net的委托机制(Java的Callback)并且这个内部变量的行为类似强制类型语言中的实例私有成员, 参考下面的代码:

//接上面的代码

var fn2 = closure()

alert(fn2())//1, 创建了新的闭包

alert(fn())//3, 原有闭包并未释放,

fn = null//将对闭包内部变量的引用释放(将fn赋其它值也一样, fn = 1), 则该闭包将会被gc回收

3, 对象, JavaScript对象一定是使用new关键字创建.

var a = {}//简化写法等价于 var a = new Object()

var b = []//简化写法等价于 var a = new Array()

4, 实例, javascript不是面向对象的语言, 但是对象有默认的constructor属性, 引用创建对象的function(可以理解为某类型的实例). 但是, 因为javascript是弱类型动态语言, 可以动态修改对象的结构或使用其它类型的引用为变量赋值, 所以并不能在语言层面确保对象的封装, 参考下面的代码:

function class(){

this.a = 1

this.b = 'a'

}

function somethingElse() {

return 1

}

//创建3个class的实例

var a = new class()

var b = new class()

var c = new class()

//此时 a.constructor === b.constructor === c.constructor === class

a.constructor = somethingElse//覆盖constructor属性, 这样a就和class没有任何关联了, 虽然有一个instanceof二元操作符, 但是其实现是比较prototype, 本例中都没有指定prototype(默认{}), 所以instanceof是无效的, a instanceof class == true, a instanceof somethingElse == true, a instanceof Object == true,

b = new somethingElse()//这时b就变成somethingElse的实例了(b.constructor === somethingElse), 但是somethingElse方法没有为实例添加任何成员, 所以b = {}

delete c.b//删除对象的成员, c = {a: 1}, 这样虽然c.constructor === class(还是class的实例), 但是与其它由class创建的实例外观就不同了.

这应该是ES3里的俩词儿

老概念了

ES5就没的提了

(其实是换词儿了)

变量对象(Variable object)

是说

JS的执行上下文中都有个对象

用来放这个执行上下文中可被访问

但是不能被delete的

函数标示符啊

形参啊

变量声明啊

什么的

这些玩意会挂在个对象上

对象的属性对应它们的名字

对象属性的值对应它们的值

但这个对象是规范上

或者说是引擎实现上的

不可在JS环境中访问到

活动对象(激活对象)(Activation object)

有了变量对象存每个上下文儿中的东西

但是它啥时候用呢

其实就是每进入一个执行上下文儿

这个执行上下文儿中的变量对象就被激活了

可以用了

也就是该上下文中的

函数标示符啊

形参啊

变量声明啊

就可以被访问到了