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)?谢谢各位大侠!
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)?谢谢各位大侠!
http://jsfiddle.net/WSjWX/
obj 这个变量指的什么?
请问:
js 引擎在创建函数时(形成函数的 [[Scope]] 属性时)会做优化?