倔强的我的曾经 2020-12-07 20:01 采纳率: 66.7%
浏览 679
已采纳

html页面调用js文件里的函数报错onclick is not defined问题(作用域问题)

// 多个tr标签

<tr>
<td><a href="javascript:void(0);">删除</a></td>
</tr>


// 第一种方式 全部在onload范围呢

<script>
window.onload = function (){
    var as = document.getElementsByTagName("a");
    for (var i = 0; i < as.length; i++) {
        as[i].onclick = function (){
        var table = this.parentNode.parentNode.parentNode;
        var tr = this.parentNode.parentNode;
        table.removeChild(tr);
        }
     }

}
</script>


// 第二种方式  全部在onload范围内 此处: del = function(obj){}

<script>
window.onload = function (){
    var as = document.getElementsByTagName("a");
    for (var i = 0; i < as.length; i++) {
        as[i].setAttribute("onclick","del(this);");
    }
    del = function(obj){
        var table = obj.parentNode.parentNode.parentNode;
        var tr = obj.parentNode.parentNode;
        table.removeChild(tr);
    }
}
</script>


//  第三种方式  此处:function del(obj){}  没有在onload范围内

<script>
window.onload = function (){
    var as = document.getElementsByTagName("a");
    for (var i = 0; i < as.length; i++) {
        as[i].setAttribute("onclick","del(this);");
    }
}
function del(obj){
    var table = obj.parentNode.parentNode.parentNode;
    var tr = obj.parentNode.parentNode;
    table.removeChild(tr);
}
</script>

       三种方法都可以给a标签加上删除功能。请问,第二种和第三种方法不同之处的原理在哪里?个人猜是作用域问题(onclick和onload) 但不知道具体是怎么回事。求一个懂的老哥讲明白点

       当第二种方法,改为 function del(obj){} , 则报错 del is not defined at HTMLAnchorElement.onclick

       而当第三种方法改为 del = function(obj){},则也可以成功执行功能

  • 写回答

1条回答 默认 最新

  • weixin_74836531 2020-12-07 20:53
    关注

    这其实就是个闭包的问题,第2个里面的格式如果改成 function del(obj) 则表示这个del方法是在闭包里面才能使用的,而你这个a标签的点击事件是调用的全局变量里面的del,所以找不到啊;del = function (obj) 这样在onload里面声明的是一个全局的del,如果加上var也同样报错 var del = function (obj),因为如果是这样也是一个闭包里面的局部变量 。

    第3个在不存在问题,不管你用del = function (obj) 还是 function  del(obj) 这个del都是全局的

    你加一个按钮试一下就知道了, <button onclick="buttonClick()">button</button>

    声明一个函数

    function buttonClick(){
            console.log(del)
    }

    你试一下你第2中方法里面,分别del = function (obj) 和  function  del(obj) 两种写法来点击一下按钮,因为这个buttonClick打印的是全局的del方法,function  del(obj) 是属于闭包里面的,所以找不到。

    同时我们知道点击事件如果你没有做绑定处理的话,函数的调用是从全局里面找的。

     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口