在js中对象就是神一般的存在,什么都是对象,你就这么理解好了。
函数是用来实现具体功能的代码,用一种方式把他们组织起来,就是函数了。
对象是有属性和方法的一个东西,在对象中的函数就变成了方法。
刚学习js不用太纠结这些概念性的东西吧。慢慢用多了就自然而然熟悉了。
我相信现在写的再详细你也未必能全搞明白。有些东西你现在不明白只是因为你还没到明白它的时候,时间会证明一切的。加油。
1:onblur 的值是一个监听函数,函数 函数 重要的事说三遍,当文本框失去焦点时会触发这个函数的调用
2.对于②行 :由于js代码是从上而下的执行 到达这一行 你来一个checkPassword() 这是一个函数的调用 也就是 页面一刷新 就会立即执行这个函数 因为加了"()" 所以就会出现立即验证的效果,函数执行完成 会有一个返回值(return 的值 ,如果函数体内不显式的返回 默认就返回 undefined) 这个时候 你② 的代码 就相当于
var checkRusult = checkPassword();
根据题主截图 返回的是一个布尔值
document.getElementById("password").onblur =checkRusult //true or false
导致的效果就是 页面刷新立马进行验证,然后你之后再失去焦点什么的 不会有任何效果
题目与问题内容,有一些差异。
document.getElementById("password").onblur = checkPassword;
上面的这句话的意思是,给password这个元素的onblur事件,添加一个函数,鼠标在离开元素时就会调用执行checkPassword函数。一般来说,验证密码规则函数的调用,都是用这种方法,就是说用户在输入完密码之后,才会去校验密码格式是否有问题。而你后面的写法:
document.getElementById("password").onblur = checkPassword()
这句话是说,给元素的onblur事件添加一个函数,如果你的checkPasswrod返回的是一个函数对象,则会添加成功,否则只会先运行一遍checkPassword函数,给你的password元素的值进行一遍校验,因为此时password值为空,所以校验结果是不符合,就会在passwrod后面出现提示,但是鼠标移入password再移出,并不会触发校验函数,并不符合实际的校验场景。
综上,在代码中出现函数体时,一般用法就是给某个事件绑定某个函数,比如你的第一种写法,只有在真正触发的这个事件时,函数才会运行;在代码中出现函数体后面加(),就是要运行该函数,至于函数运行之后会发生什么,情况就太复杂了。
引擎会优先加载函数 变量方式声明的 会按顺序加载 。其他没区别。
②document.getElementById("password").onblur = checkPassword();
当你的代码解析到这一行的时候不会直接执行checkPassword()函数.
①document.getElementById("password").onblur = checkPassword;
是给password绑定了失去焦点事件,在密码框失去焦点才会触发并执行checkPassword()函数.