zoukankan      html  css  js  c++  java
  • 0级DOM行内嵌套样式注册事件,事件函数在onload里面声明报错

    先上代码说现象

    <body>
    	<button class="btn" onclick = "rest(100)">按钮</button>
    </body>
    <script>
    	window.onload=function(){
    		var rest = function(i){
    			alert(i);
    		}
    	}
    </script>
    

      在body里面放一个按钮button,给其注册一个点击事件,事件函数是rest,函数rest在javascript的onload事件里面声明。最后浏览器会报错:Uncaught ReferenceError: rest is not defined,函数

    rest未找到。

    原因分析

      首先说明一下onload事件,onload是在文档树结构与所有的文件加载完后自动执行的一个事件函数,在该事件函数执行时意为文档已经全部加载完成。大部分人也许知道这个0级DOM事件所存在的错误现

    象,但是都被onload“字面量”所迷惑而不知道真实的原因;

      在这里,其实的最大的问题还是在于函数作用域的问题,说白了就是0级DOM的执行函数rest在js的onload加载事件中声明的,而这个0级的DOM事件是在js的onload加载事件之外注册的;所以不管这个onload加

    载事件函数执行与否都不会影响浏览器的执行结果。按照函数作用域的搜索原则,函数外部的其他函数不能调用该函数内部的变量(在ECMAscript语法中函数也是变量),这里的错误就是0级DOM事件调用的是

    同级onload加载事件的事件函数内部声明的函数,所以报rest is not defined也就理所应然了。

    发现原因修改代码

    1.放在全局处声明事件执行函数

    <body>
    	<button class="btn" onclick = "rest(100)">按钮</button>
    </body>
    <script>
    	window.onload=function(){
    	/*加载事件函数内部*/
    	}
    	//在全局处声明函数
    	var rest = function(i){
    		alert(i);
    	}
    </script>	
    

    2.在加载事件内部绑定0级DOM事件

    <body>
    	<button class="btn" >按钮</button>
    </body>
    <script>
    	window.onload=function(){
    		/*加载事件函数内部*/
    		var rest = function(i){
    			alert(i);
    		}
    		/*给DOM对象绑定事件函数,函数主体执行rest函数*/
    		document.querySelector(".btn").onclick = function(){
    			rest(1000)
    		};
    	}	
    </script>	
    

      

    以上是个人理解与解释这个问题,如有更好的解释或本博客有不足之处请不吝指出,谢谢。

  • 相关阅读:
    SpringBoot前端模板
    Http协议与TCP协议简单理解
    Kafka简介、基本原理、执行流程与使用场景
    初学Kafka工作原理流程介绍
    Redis数据持久化、数据备份、数据的故障恢复
    zookeeper的分布式锁
    eclipse下将maven项目打包为jar(1.不带第三方jar,2.带第三方jar)
    Redis入门篇(安装与启动)
    java操作Redis缓存设置过期时间
    java单例模式实现
  • 原文地址:https://www.cnblogs.com/suzhen-2012/p/5708168.html
Copyright © 2011-2022 走看看