是否可以绕过内置的JavaScript函数

是否可以绕过内置的JavaScript函数,javascript,Javascript,我尝试使用以下代码查看传递给内置JavaScript函数alert()的参数。一旦我得到了传递给它的参数,现在我想调用实(内置)函数,这样代码就不会中断 built_in_alert = alert; function alert(text)// Our custom alert function. { console.log('Alert function called with param :'+ text); built_in_alert("Calling with "+text) /

我尝试使用以下代码查看传递给内置JavaScript函数alert()的参数。一旦我得到了传递给它的参数,现在我想调用实(内置)函数,这样代码就不会中断

built_in_alert = alert;
function alert(text)// Our custom alert function.
{ 

console.log('Alert function called with param :'+ text);
built_in_alert("Calling with "+text) // try to call the actual built in alert() function.

return 0;

}

alert("hi");

这段代码以某种方式进入无限递归。

最好不要为函数使用保留名称,但如果确实想这样做(我再说一遍,这是个坏主意),则必须使用
窗口调用实际的
警报()

function alert(text)// Our custom alert function.
{ 

console.log('Alert function called with param :'+ text);
window.alert("Calling with "+text); // try to call the actual built in alert() function.

return 0;

}

alert("hi");

嗨,你看起来像这样吗

<!DOCTYPE html>
<html>
<body>


<button onclick="myFunction()">Click me</button>

<p id="demo"></p>

<script>
function myFunction() {
var text = "hello";
dynamicalert("Custom function "+text )
}
function dynamicalert(_text) {
alert(_text)
}
</script>

</body>
</html>

点击我

函数myFunction(){ var text=“你好”; dynamicalert(“自定义函数”+文本) } 函数dynamicalert(_text){ 警报(_文本) }
如果您想使用name属性,那么


警报(document.getElementsByName(“用户名”)[0].value)

我同意阿明·贾法里(Amin Jafari)的观点,即替换内置函数通常不是一个好主意,但在某些情况下,它对测试或其他原因很有用

也就是说,代码不起作用的原因是替换的
alert()
函数的形式如下:

function alert( text ) { ... }
在执行同一范围内的任何其他代码之前,先处理函数声明。这有时被称为“功能提升”,尽管这有点用词不当。(该功能实际上并不像术语“提升”所暗示的那样移动。)

在任何情况下,在将其保存到
内置警报
变量之前,这将替换内置的
警报()

改为这样做:

alert = function( text ) { ... }
因为您现在使用一个普通的赋值来替换内置的
alert()
,所以替换会在您期望的时间和地点进行

请在此处尝试:

内置警报=警报;
警报=函数(文本){
log('Alert function called with param:'+text);
内置警报(“用“+文本调用”);
}
警惕(‘hi’)您可以尝试以下方法:

function custom_alert(text)// Our custom alert function.
{ 
    console.log('Alert function called with param :'+ text);
    window.built_in_alert("Calling with "+text);
    return 0;
}

if (!window.built_in_alert) {
    window.built_in_alert = alert;
    window.alert = custom_alert;
}

将某个对象指定给非基元类型时,它将被指定为引用。在您的例子中,您将
内置警报
分配给一个名为
警报
的函数(非原语),因此本质上,您的
内置警报
警报
是一样的功能声明已悬挂。因此,您正在执行
函数alert(){};内置警报=警报。函数声明在
内置警报
@AdityaParab:这与原语或对象无关。如果在全局范围内定义了
函数警报(){}
,则会出现相同的问题。我知道,但我能问一下,为什么会有人这样做?就像他们想把错误弄出来一样!不知道投票结果如何。但是我猜这个例子没有考虑可能的作用域。它没有提到您在什么上下文上声明警报函数。另外,它还可以覆盖
窗口。警告
,因为所有的非primiteves都是通过引用的。@AminJafari-我对你的答案投了赞成票。它做它需要做的事情。@AdityaParab这就是为什么我说使用内置函数名编写函数是个坏主意!回答得很好+1.