JavaScript方法undefined/null原因探究及闭包简单实现

昨天一个刚写前端不久的同学发消息问这个问题(如下图):

HTML代码为(省略部分代码):

1 <head>
2 <script src="test.js"></script>
3 </head>
4 <body>
5     <div id="output">0</div>
6     <button id="plus">+1</button>
7     <button id="minus">-1</button>
8 </body>

test.js最初代码为:

1 var plus=document.getElementById(‘plus‘);
2 var minus=document.getElementById(‘minus‘);
3 var output=document.getElementById(‘output‘);
4 plus.addEventListener(‘click‘,function(){
5     console.log(‘+1‘);
6 },false);

结果就为控制台报出了“Uncaught TypeError: Cannot read property ‘addEventListener‘ of null”的错误,究其原因,是因为在HTML的DOM结构未加载完成时,就已经加载好js文件,并对DOM元素进行绑定事件操作,因此不能会报出null的错误,有时也可能会出现undefined的错误。

解决这个问题的方法,可以从以下两种方式就行考虑:

一、在HTML文件中将<script>放在DOM最后加载,即:

1 <body>
2     <div id="output">0</div>
3     <button id="plus">+1</button>
4     <button id="minus">-1</button>
5     <script src="test.js"></script>
6 </body>

二、在js代码块放到window.onload事件中,待基本文档结构加载完成后再执行事件绑定:

1 window.onload = function() {
2     var plus = document.getElementById(‘plus‘);
3     var minus = document.getElementById(‘minus‘);
4     var output = document.getElementById(‘output‘);
5     plus.addEventListener(‘click‘, function() {
6     console.log(‘+1‘);
7     }, false);
8 }

当然了,这个也可以用jQuery的ready函数做,原理类似。PS:前些天面试时遇到了这样一个问题:说一说DOMContentLoaded事件、onload事件和jq的ready事件,实际上是有所区别的,一篇博文就说说这个问题,先留个坑。

然后这个问题就解决掉了,下面就是完成功能了,要求按“+1”按钮时,数字+1;按“-1”按钮时,数字-1;

当然了,这个问题比较容易,了解下作用域和闭包就能写出来了,也给同学做了出来。HTML代码还是如上,下面是完整的JavaScript代码:

 1 window.onload = function() {
 2     var plus = document.getElementById(‘plus‘);
 3     var minus = document.getElementById(‘minus‘);
 4     var output = document.getElementById(‘output‘);
 5     var num=output.innerText;
 6     var count = function(event){
 7         var target=event.target;
 8          switch(target.id){
 9             case ‘plus‘:
10           num++;
11           output.innerText=num;
12             break;
13
14             case ‘minus‘:
15           num--;
16           output.innerText=num;
17             break;
18         }
19     };
20     document.addEventListener(‘click‘,count,false);
21 }

最终运行效果如下:

时间: 2024-10-25 23:23:39

JavaScript方法undefined/null原因探究及闭包简单实现的相关文章

JavaScript 中undefined,null,NaN的区别

1.类型分析: js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型.var a1;var a2 = true;var a3 = 1;var a4 = "Hello";var a5 = new Object();var a6 = null;var a7 = NaN;var a8 = undefined;alert(typeof a); //显示"undefined"alert(typ

JavaScript:undefined!=false之解 及==比较的规则

JS中有一个基本概念就是: JavaScript中undefined==null 但undefined!==null undefined与null转换成布尔值都是false 如果按照常规想法,比如下面的代码 var a=1; alert(Boolean(a));//返回true //那么下面的代码也应该返回true alert(1==true); //但肯定的,下面的代码会返回false alert(1===true); 但对于下面的代码,估计会让大部分JS程序员疑惑 alert(123==tr

javascript类型系统——undefined和null

× 目录 [1]原因 [2]undefined [3]null 前面的话 一般的程序语言,表示空的只有null,但javascript的设计者Brendan Eich却设计了一个undefined,这无疑增加了程序复杂度,但这样做也是有一定原因的.本文将详细介绍javascript中的undefined和null 历史原因 1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示”无”的值.根据C语言的传统,null被设计成可以自动转为0 但是,JavaScript的设

JavaScript中undefined与null的区别

通常情况下, 当我们试图访问某个不存在的或者没有赋值的变量时,就会得到一个undefined值.Javascript会自动将声明是没有进行初始化的变量设为undifined. 如果一个变量根本不存在会发生什么事: >>> fooReferenceError: foo is not defined 我们得到了一个错误信息.我们在该变量上用typeof操作符看看它是什么类型: >>> typeof foo"undefined" 我们得到的结果为字符串“u

Javascript数据类型——undefined和null的异同

Javascript的基本数据类型中有undefined和null两种只有一个值得特殊数据类型.其中undefined表示未被初始化,不是为声明.而null表示一个空对象指针,而这也是使用typeof检测null返回"object"的原因. undefined表达的是通过var声明了变量,但没有显示的赋值(由此可以推论,Javascript的变量默认值为undefined).然而对声明未赋值的变量和未被声明的变量执行typeof操作返回值均是"undefined".

JavaScript中的null和undefined

null :表示无值;undefined : 表示一个未声明的变量,                或已声明但没有赋值的变量,                或一个并不存在的对象属性. ==运算符将两者看作相等.如果要区分两者,要使用===或typeof运算符. 使用if (!object){}两者就都包含了 补充:2006.12.6var obj = "aaa";var nullobj; if (obj == null || obj == undefined || (!obj) ){

javascript中undefined和null的区别详解

一.问题的由来 永远不要直接使用undefined进行变量判断使用字符串"undefined"对变量进行判断 这里,undefined是原始值,在JS中undefined出现只有两种情况,一种是变量未定义.一种是定义了变量,但是没有赋值. 如果这个地方person未定义,那么利用person===undefined全等判断就会报错,person未定义但是如果使用typeof来判断,那么就不会报错了. ep: alert(person == undefined);//报错 person

javascript数组去重(undefined,null,NaN)

数组去重记录: 1.indexOf 方法,无法识别NaN 1 var ary = [false, true, undefined, null, NaN, 0, 1, 1, "1", "1", {}, {}, "a", "a", NaN]; 2 3 Array.prototype.uniq = function() { 4 var _this = this; 5 return _this.filter(function(item

JavaScript中undefined和null的区别

JavaScript中undefined和nullundefined:表示没有数值,在使用var 声明变量但未对其加以初始化时,这个变量的值就是undefined null:表示有数值,但是数值为“空”. 1. 两者的声明 声明但未定义:undefined; 1 var a; 2 console.log(a); // 执行结果:undefined 声明且定义为null; 1 var b = null; 2 console.log(b); //执行结果:null 2. typeof类型不同 und