首页 > 试题广场 >

执行以下程序,下列选项中,说法正确的是() 点...

[单选题]

执行以下程序,下列选项中,说法正确的是()


<button>点击</button>
<script>
function a(){
    console.log(1);
    return function b(){
        console.log(2);
}
}
var btn = document.querySelector('button');
btn.onclick = a(); ...①
btn.onclick = a; ...②
</script>


  • 若注释①,则执行结束后会输出1,当用户点击button按钮时,输出2

  • 若注释①,则执行结束后不会有输出,当用户点击button按钮时,输出1

  • 若注释②,则执行结束后不会有输出,当用户点击button按钮时,输出1

  • 若注释②,则执行结束后输出1,当用户点击button按钮时,不会有任何输出

注释(掉)①,即执行btn.onclick = a 
执行结束后不会有输出:相当于把函数a赋值给btn的点击事件处理程序(此时函数a不会执行)。
点击按钮后打印1,返回值中的函数b不会执行
注释(掉)②,即执行btn.onclick = a()
执行结束后输出1:函数a执行,打印1并将返回值(函数b)赋值给btn的点击事件处理程序
点击按钮后打印2
编辑于 2022-03-18 15:33:47 回复(5)

事件处理程序的概念请参照小红书13.2.2章节:

dom0级事件处理程序是将一个函数赋值给元素的事件处理程序属性:注意是赋值而不是调用

  1. 对于btn.onclick=a()

相当于把元素btn的点击事件处理程序赋值为a执行完毕后的返回值b

所以btn.onclick=a()代码等价于:

btn.onclick = function () {     console.log(2)  }  //注释掉2时,代码执行流程是:执行a()函数,输出1,点击后执行b,输出2,C、D错误
  1. 对于btn.onclick=a

相当于把元素btn的点击事件处理程序直接赋值为a

代码等价于

btn.onclick = function () {    console.log(1)    return function b() {       console.log(2)   }  } //注释掉1时,执行时不会有输出,只有点击按钮才会执行,输出1,后面的return在此时没有意义不会执行,选B

编辑于 2021-12-25 14:10:40 回复(1)
1.=a(),是执行a,会输出1,并返回函数b给点击事件绑定,当点击事件触发后输出2;
2.=a,是把函数a赋给点击事件,不是执行函数a,点击事件是异步函数,当点击触发时,执行函数a,则输出1并返回函数b,但函数b没有被调用执行。
发表于 2022-04-07 22:30:02 回复(0)
又没人解释,离谱
发表于 2021-12-11 17:36:17 回复(6)
看了半天发现是选项意思理解错了。。
发表于 2023-02-16 19:46:46 回复(0)
我不理解的是,注释第二个式子,还没有点击按钮,为什么函数a()会执行输出1?它并没有被调用吧
发表于 2022-10-06 16:57:17 回复(0)
这道题我疏忽了,闭包那一块不扎实。闭包返回的是个方法,所以1式其实是btn.onclick=b();b没有执行,2式是方法体。
发表于 2022-07-28 09:58:16 回复(0)
题目理解错误,这个注释①是指,注释掉①,执行②的代码。。。。
发表于 2022-03-30 23:46:01 回复(0)
题目挺绕的
发表于 2022-01-02 22:18:01 回复(0)
这又是一道语文题
发表于 2023-12-17 20:44:00 回复(0)
答案里面的注释是注释掉的意思,不要理解错了
发表于 2023-03-02 16:52:17 回复(0)
看错题了,完全理解反题意了hh
发表于 2022-09-27 20:53:01 回复(0)
js这块还是难点
发表于 2022-09-19 17:11:29 回复(0)
A选项,注释1,则执行下面的btn.onclick = a; 相当于把 a函数赋值给 btn.onclick事件,只是赋值,还没有执行,当你点击的时候执行,输出1,btn.onclick事件 返回一个闭包函数;
D选项,若注释2,则执行btn.onclick = a(); 绑定onclick事件的时候,立刻执行a函数,输出1,并且把内部的闭包函数返回 绑定给onclick事件,点击onclick,执行闭包函数,输出2
发表于 2022-08-26 15:20:23 回复(0)
意思就是把2注释掉以后,在当点击按钮前a()已经执行完,点击时会执行b()!a()就是执行早了的意思吧
发表于 2022-07-18 21:27:04 回复(0)
注释①,则
btn.onclick=function a, 执行后不会有结果输出,点button调用a函数,输出1;
注释②,则
btn.onclick=function a()执行后的函数,即btn.onclick=function b, 执行后输出1,点button调用b函数,输出2
发表于 2022-06-24 15:53:54 回复(0)
脑筋急转弯题,还以为和之前的题目一样是解释①,②行处的代码是什么作用。
结果问的是注释掉①、或者注释掉②后再执行是什么结果。
发表于 2022-06-20 21:10:23 回复(0)
我都怀疑是不是标识错了 一二 的位置
发表于 2022-03-16 17:04:42 回复(0)
html事件和dom0级的区别:(同的是都无法设置事件流)
   	1. 前者可以加()传参,后者不然;
	2. 前者this不是dom元素,后者是
            Dom0的传参:  *使用call或者apply方法加参数*	
	    	<input type="button" id="btn4" workerNum="==属性参数==" value="动态绑定事件并传递参数" />

		//绑定函数
		bindEvent(document.getElementById("btn4"),"onclick",onclickWorker,"btn=123");
		
		//响应函数
		function  onclickWorker(wNum){ alert("工号为:"+ wNum); }
		
		//执行事件绑定,将参数传给事件源
		function bindEvent(dom, eventType , fun ,args){
		    dom[eventType] = handleEvent;
		    function handleEvent(){ //闭包
			fun.call(this,args);  //给响应函数的 this 指针赋值为 dom
		    }
		}
		
		其实综合起来就是一句话:document.getElementById("btn4")["onclick"]= _ => onclickWorker("99999”);

	3. dom2也不可以直接传参,支持事件流,不兼容
!!!  第一次注意到原生js绑定事件传参: html事件直接用,dom0和dom2事件还要用call方法!!!
可能是vue用@click多了,被他的封装麻痹了
发表于 2022-01-06 11:07:53 回复(0)