如何在其他函数中调用$(a())类函数及跨函数调用xyz函数?
JavaScript函数调用问题解答
嘿,我来帮你拆解这两个函数调用的问题:
问题1:如何在另一个函数中调用形如$(a())的函数?
首先得明确你写的$(a())的逻辑:如果$是jQuery(或类似库)的全局函数,$(a())其实是先执行a()函数,再把它的返回值传给$。但我猜你大概率是想写$(function a() { ... })——也就是把a作为回调传给$(比如jQuery的DOM Ready回调),这种情况下a是函数表达式的内部名称,只能在它自己的函数作用域里访问,外部函数默认是调用不到的。
要让外部函数能调用它,你可以这么做:
方案1:把函数暴露到全局作用域
在回调函数内部,把自身赋值给window的属性,这样全局范围内都能访问到:
$(function a() { console.log("函数a执行了"); // 把a挂载到window上,让全局能访问 window.a = a; }); // 另一个函数里调用a function b() { a(); // 现在可以正常执行 }
方案2:先定义全局函数,再传给$
如果你一开始就把函数定义在全局作用域,再把它作为参数传给$,这样外部调用就毫无问题:
// 先定义全局函数a function a() { console.log("函数a执行了"); } // 把a传给$(比如作为DOM Ready回调) $(a); // 另一个函数直接调用 function b() { a(); }
问题2:如何从函数b中调用定义在$()里的xyz函数?
看你给出的代码:
$(function xyz() { sum(1 + 2); }); function b() { xyz(); }
这里的问题是:xyz是函数表达式的内部标识符,它的作用域仅限于自己的函数内部,全局作用域(也就是b函数所在的地方)根本找不到xyz,所以直接调用会报错xyz is not defined。
解决方法同样有几种,按需选择:
方案1:把xyz暴露到全局
和问题1的思路一样,在回调内部把xyz挂载到window上:
$(function xyz() { sum(1 + 2); // 暴露到全局 window.xyz = xyz; }); function b() { xyz(); // 现在可以正常调用 }
方案2:定义全局函数后再传给$
如果不介意全局作用域的少量污染,直接把xyz定义成全局函数,再作为回调传给$:
function xyz() { sum(1 + 2); } // DOM加载完成后执行xyz $(xyz); function b() { xyz(); // 直接调用即可 }
方案3:用闭包封装,避免全局污染
如果不想污染全局作用域,可以用IIFE(立即执行函数表达式)封装,把xyz暴露到一个自定义对象上:
var myApp = (function() { // 内部定义xyz function xyz() { sum(1 + 2); } // 把需要外部访问的函数返回出去 return { callXyz: xyz }; })(); // 把xyz作为回调传给$ $(myApp.callXyz); // 在b函数里通过myApp调用 function b() { myApp.callXyz(); }
内容的提问来源于stack exchange,提问作者sivaprakash.s
相关产品推荐
相关产品推荐

