Hi, 请直接看待码!<script>
function Person (name, age) {
this.name = name;
this.age  = age; if (!this.sayName) {
arguments.callee.prototype.sayName = function() {
var ok = this.name + ':' + this.age;
// var ok = name + ':' + age;
alert(ok);
}
}
}
a = new Person('aaa', 111);
b = new Person('bbb', 222);
a.sayName();
b.sayName();
</script>说明:
1, Person 中 if 判断只会在第一次调用构造函数时执行.
2, 创建 sayName 对应的匿名函数时, 匿名函数的 [[scrope]] 属性保存了 Person 的活动对象(变量对象).基于以上两点得出:
第一次调用 Person 时创建了闭包, 只要有对 Person(这个函数) 的引用, 这个变量对象就不能释放;因此问题来了:
但是我用 开发工具 设置断点, 然后 Watch Expressions 设置观察 obj 这个变量, 但是显示未定义.
如果 Person 第一次调用的变量对象没有释放, 那么就应该可以观察到 obj. 这个地方怎么观察不到 obj, 难道 js 引擎在创建函数时(形成函数的 [[Scope]] 属性时)会做优化?释放不会用到的变量(上面例子中的 obj)?谢谢各位大侠!

解决方案 »

  1.   

    挺正常的阿,有什么问题?
    http://jsfiddle.net/WSjWX/
      

  2.   

    我想问的是 “js 引擎在创建函数时(形成函数的 [[Scope]] 属性时)会做优化”?请看上面的例子
      

  3.   

    看不太懂
    obj 这个变量指的什么?
      

  4.   

    obj 指 name 和 age, 发帖时没看好, 发完改不过来了。。
      

  5.   

    说实话,看同学的CODE貌似听神曲。你说有什么必在主要是初始化静态属性的构造函数中给类Person的原型初始化一个“sayName”的方式方法?在构造外部Person.prototype.sayName多好啊,谁不知道arguments.callee就是Person啊,真是“带第个带带第个带带第个带”,太忐忑了.......LOL
      

  6.   

    额啊, 让大牛耻笑了;我又不是在炫耀什么。。
    请问:
    js 引擎在创建函数时(形成函数的 [[Scope]] 属性时)会做优化?