当我意识到整个util对象中只有一个函数需要返回时,我正在练习跨浏览器代码,我想知道为什么其他函数不需要返回。从我的理解JavaScript将返回未定义时,没有返回被调用,除非它是一个构造函数,在这种情况下,它将返回这个。
我用util中的所有函数测试了它,返回了每个条件的结果,并且它工作了。然后我对它进行了测试,在条件的任何结果中都没有返回,但是在getTarget函数中没有返回就无法工作。
谁能帮助我更好地理解这个原因?jsFiddle在这里http://jsfiddle.net/SusannDelgado/CnWzE/
var evtUtil = {
//cross browser Events
addEvent: function (el, type, fn) {
if (typeof addEventListener !== "undefined") {
el.addEventListener(type, fn, false);
} else if (typeof attachEvent !== "undefined") {
el.attachEvent("on" + type, fn);
} else {
el["on" + type] = fn;
}
},
removeEvent: function (el, type, fn) {
if (typeof removeEventListener !== "undefined") {
el.removeEventListener(type, fn, false);
} else if (typeof detachEvent !== "undefined") {
el.detachEvent("on" + type, fn);
} else {
el["on" + type] = null;
}
},
getTarget: function (event) {
if (typeof event.target !== "undefined") {
return event.target;
} else {
return event.srcElement;
}
},
preventDefault: function (event) {
if (typeof event.preventDefault !== "undefined") {
event.preventDefault();
} else {
event.returnValue = false;
}
}
};
Return用于将某些内容从函数传递给调用它的代码(一般来说)。因此,在一个不需要传递任何东西的函数中,比如removeEvent
,它只是修改其他东西的状态,这是没有必要的。
与getTarget
的不同之处在于,正如它在名称中所说,您试图检索一个事物(在本例中是事件的目标对象)。所以在调用getTarget
的代码中,"某事"是预期的。正如您所说,没有返回,JS只是返回undefined
。
只有当您希望函数具有实际返回值时才需要声明return,无论它是字符串,布尔值,对象,函数等。如果函数对其他东西进行操作,比如添加事件处理程序或向其他东西添加属性,则不需要返回值。你可以用return this
来链接这个方法。
// An explicit return value
function getSomething() {
return 'someValue';
}
var something = getSomething(); // something = someValue
// Operate on something else. No explicit return value
function changeSomething(something) {
something = 'someOtherValue';
};
changeSomething(something); // something = someOtherValue
// Setting the variable to the return of a non-explicit return value
something = changeSomething(something); // something = undefined
// Return this to chain
var hash = {
addProp: function (name, value) {
this[name] = value;
return this;
}
};
hash.addProp('test', 'value').addProp('test2', 'value2'); // hash = Object {addProp: function, test: "value", test2: "value2"}