由于您正试图掌握常规 JS,我认为对您来说最有趣的方法是使用命名回调:
$(document).ready(function()
{
function animateCube(e)//can be declared outside ready CB, too
{//jQuery passes the event object to the function
$(this).fadeOut();//? fade only clicked element?
$('.test').fadeOut();
$('.test').delay(500).slideDown();
}
$('.link, .test').on('click',animateCube);
});
您需要知道的是函数是一等对象,并且可以作为参数传递给另一个函数,就像您在 jQuery ( .click(function
<---) 中一直做的那样。这就是为什么写恕我直言没有意义.click(function() { anotherFunction();});
。您正在动态创建一个辅助函数对象,将其传递给调用它的 jQuery,它所做的只是调用您希望看到执行的函数。事实上,函数是在特定的上下文 ( $(this)
) 中调用的,而这正是您可能想要使用的上下文。在它周围包装一个虚拟函数并没有加起来。如果您想在给定函数中添加一些额外的东西,只需将它们视为它们的对象. 它们可以是参数,函数的返回值,它们可以具有属性,它们提供了一个原型(-链),它们甚至可以同时被多个变量引用......考虑一下:
$(document).ready(//<-- open bracket: this is a function call
function(){});//we're creating a function AND pass it as an argument
所以,ready
我们调用的方法可能看起来像这样(它看起来比这更复杂,但这不是重点):
object.ready = function(functionArgument)
{
//the function we passed looks like a variable now:
console.log(typeof functionArgument);//"function"
//ways this function can be called:
functionArgument();
functionArgument.call(this);//call in current context
functionArgument.apply(object,[1,2,3]);//call as a method of object, and pass 3 arguments
functionArgument.bind(window);//bind global context
functionArgument();//call in bound context
};
函数在 JS 中是简洁的东西,而且,同样:它们也是对象,因此可以像任何其他对象一样为它们分配属性。在我们的示例中:
functionArgument.hasAProperty = functionArgument;
functionArgument = (function(originalFunction)//this was the original function
{
return function()//<-- return a function, that will be assigned to our var
{
console.log('I used to be:');
console.log(oringalFunction);
console.log('Now I do even more! But did I loose my property?');
console.log(typeof functionArgument.hasAproperty);//undefined
console.log('Yes, but: ' + typeof originalFunction.hasAProperty + ' Not entirely!');
};
})(functionArgument.hasAProperty);//passes a reference to itself
让我知道这对您是否有意义,这是未经测试的东西,但它遵循 IIFE 和闭包的基本原则。