Discuss / JavaScript / 最后一个装饰器例子的疑问?

最后一个装饰器例子的疑问?

Topic source

duzengrass

#1 Created at ... [Delete] [Delete and Lock User]

最后一个装饰器例子中,

var oldParseInt = parseInt; //这个保存的是引用吧?
//此处更改parseInt不会更改oldParseInt吗?也就是说parseInt变化了,oldParseInt也会变
window.parseInt = function () {
    count += 1;
    return oldParseInt.apply(null, arguments); // 调用原函数
};

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

自己测试:

var a = 'Name';
var b = a;
a = 'changed';
console.log(b);

要理解变量是指向对象的引用

附房子

#3 Created at ... [Delete] [Delete and Lock User]

var count = 0; var oldParseInt = parseInt; // 保存原函数 window.parseInt = function () { count += 1; return oldParseInt ; // 调用原函数,改成直接调用oldParseInt }; parseInt('10'); parseInt('20'); parseInt('30'); count; // 3

3

修饰器的例子在chrome测试如上代码 结果正确

为何必须使用apply呢?

廖雪峰

#4 Created at ... [Delete] [Delete and Lock User]

用apply你不必关心原函数参数的个数

因为parseInt可以接收1-2个参数

话说那个二楼,你的结果是正确的么? 光只看count有什么用, parseInt('10'); 这个返回的是10么? 你那样写,参数都没传进去

在控制台先执行

var b = a;

var a = function() {
    console.log("这是旧函数");
}

b() // 这是旧函数
a() // 这是旧函数

然后清空控制台,重新定义a

a = function() {
    console.log("这是新的");
}

b() // 这是旧函数
a() // 这是新的

这就是老师说的变量是对象的引用么? ba 都指向了旧的匿名函数, 新赋 a 的那个匿名函数和旧的没有任何关系,所以现在 a 指向了一个新的匿名函数,而 b 还是指向旧函数 ? 不知道理解有没有问题

seven_dong

#7 Created at ... [Delete] [Delete and Lock User]

我的理解是,function是引用类型指向的堆内存中真正的object的引用,假如parseInt指向的是原来的object1,那个付给oldparseInt后,old也指向了object1,重新定义的function实际是object2,那么定义完成后parseInt实际上就指向object2了,所以不会影响之前的object1.

出生之心

#8 Created at ... [Delete] [Delete and Lock User]

为什么里面的使用

apply(null, arguments);

而不是

apply(this, arguments);

hanashin

#9 Created at ... [Delete] [Delete and Lock User]

因为parseInt函数不需要传入对象

Yangsirgo2015

#10 Created at ... [Delete] [Delete and Lock User]
var b = a;

var a = function() {
    console.log("这是旧函数");
}

var a = function() {
    console.log("这是新函数");
}
b() // 报错.
a() // 这是旧函数

几楼的我忘了,那个楼层的哥们写错了.注意.


  • 1
  • 2

Reply