调试模式下定义的函数立即消失
Function defined in debug mode immediately disappears
在断点期间,我在控制台中定义了一个函数(如here所述),但我无法在控制台中使用它(“未定义”错误)。
为什么我刚刚定义的一个函数马上就消失了?我该如何使用它?
如何使用?
方法 1:首先加载页面,然后 运行 代码段。
方法二:将函数breakOn
定义为变量(匿名函数表达式)如果你想在断点激活时成功定义它(由'root'指出)
var breakOn = function (obj, propertyName, mode, func) {
// this is directly from https://github.com/paulmillr/es6-shim
var getPropertyDescriptor = function (obj, name) {
var property = Object.getOwnPropertyDescriptor(obj, name);
var proto = Object.getPrototypeOf(obj);
while (property === undefined && proto !== null) {
property = Object.getOwnPropertyDescriptor(proto, name);
proto = Object.getPrototypeOf(proto);
}
return property;
}
var verifyNotWritable = function() {
if (mode !== 'read')
throw "This property is not writable, so only possible mode is 'read'.";
}
var enabled = true;
var originalProperty = getPropertyDescriptor(obj, propertyName);
var newProperty = { enumerable: originalProperty.enumerable };
// write
if (originalProperty.set) {// accessor property
newProperty.set = function(val) {
if(enabled && (!func || func && func(val)))
debugger;
originalProperty.set.call(this, val);
}
} else if (originalProperty.writable) {// value property
newProperty.set = function(val) {
if(enabled && (!func || func && func(val)))
debugger;
originalProperty.value = val;
}
} else {
verifyNotWritable();
}
// read
newProperty.get = function(val) {
if(enabled && mode === 'read' && (!func || func && func(val)))
debugger;
return originalProperty.get ? originalProperty.get.call(this, val) : originalProperty.value;
}
Object.defineProperty(obj, propertyName, newProperty);
return {
disable: function() {
enabled = false;
},
enable: function() {
enabled = true;
}
};
};
例如在控制台(或代码段末尾)输入 breakOn(document.body, 'clientWidth', 'read')
,如果在断点处继续执行代码,
然后使用 document.body.clientWidth
.
访问(读取)控制台中 document.body 对象的 属性 'clientWidth'
这应该使片段代码在调试器语句处停止。现在可以使用调用堆栈来查看谁或什么更改了 属性,在本例中为 'anonymous'.
调试器似乎丢弃了使用 function foo() {}
格式定义的函数,但保留了使用 foo = function() {}
.
格式定义的函数
在断点期间,我在控制台中定义了一个函数(如here所述),但我无法在控制台中使用它(“未定义”错误)。
为什么我刚刚定义的一个函数马上就消失了?我该如何使用它?
如何使用?
方法 1:首先加载页面,然后 运行 代码段。
方法二:将函数breakOn
定义为变量(匿名函数表达式)如果你想在断点激活时成功定义它(由'root'指出)
var breakOn = function (obj, propertyName, mode, func) {
// this is directly from https://github.com/paulmillr/es6-shim
var getPropertyDescriptor = function (obj, name) {
var property = Object.getOwnPropertyDescriptor(obj, name);
var proto = Object.getPrototypeOf(obj);
while (property === undefined && proto !== null) {
property = Object.getOwnPropertyDescriptor(proto, name);
proto = Object.getPrototypeOf(proto);
}
return property;
}
var verifyNotWritable = function() {
if (mode !== 'read')
throw "This property is not writable, so only possible mode is 'read'.";
}
var enabled = true;
var originalProperty = getPropertyDescriptor(obj, propertyName);
var newProperty = { enumerable: originalProperty.enumerable };
// write
if (originalProperty.set) {// accessor property
newProperty.set = function(val) {
if(enabled && (!func || func && func(val)))
debugger;
originalProperty.set.call(this, val);
}
} else if (originalProperty.writable) {// value property
newProperty.set = function(val) {
if(enabled && (!func || func && func(val)))
debugger;
originalProperty.value = val;
}
} else {
verifyNotWritable();
}
// read
newProperty.get = function(val) {
if(enabled && mode === 'read' && (!func || func && func(val)))
debugger;
return originalProperty.get ? originalProperty.get.call(this, val) : originalProperty.value;
}
Object.defineProperty(obj, propertyName, newProperty);
return {
disable: function() {
enabled = false;
},
enable: function() {
enabled = true;
}
};
};
例如在控制台(或代码段末尾)输入 breakOn(document.body, 'clientWidth', 'read')
,如果在断点处继续执行代码,
然后使用 document.body.clientWidth
.
这应该使片段代码在调试器语句处停止。现在可以使用调用堆栈来查看谁或什么更改了 属性,在本例中为 'anonymous'.
调试器似乎丢弃了使用 function foo() {}
格式定义的函数,但保留了使用 foo = function() {}
.