在调用Javascript函数之前,是否必须定义它
Does a Javascript function have to be defined before calling it?
如果在定义之前运行下面的函数,我会得到这个错误。。。
Uncaught ReferenceError: openModal is not defined
运行然后定义
$(document).ready( function() {
delay(openModal, 2000);
delay = function (f, t) {
setTimeout(function() {
f();
}, t);
};
openModal = function () {
$('#modal-box').css( {
left: $(window).width() / 2 - $('#modal-box').width() / 2,
top: $(window).height() / 2 - $('#modal-box').height() / 2
} );
$('#modal-box').show();
$('#modal-mask').show();
};
});
现在,如果我先定义函数,然后调用它,它就会工作。。。我有PHP背景,所以我习惯于全局访问函数,我是做错了什么,还是所有函数都必须定义好才能使用?
$(document).ready( function() {
delay = function (f, t) {
setTimeout(function() {
f();
}, t);
};
openModal = function () {
$('#modal-box').css( {
left: $(window).width() / 2 - $('#modal-box').width() / 2,
top: $(window).height() / 2 - $('#modal-box').height() / 2
} );
$('#modal-box').show();
$('#modal-mask').show();
};
delay(openModal, 2000);
} );
将函数分配给变量时,必须先进行分配,然后才能使用变量访问函数。
如果用正则语法声明函数,而不是将其分配给变量,那么它是在解析代码时定义的,因此这很有效:
$(document).ready( function() {
delay(openModal, 2000);
function openModal() {
$('#modal-box').css( {
left: $(window).width() / 2 - $('#modal-box').width() / 2,
top: $(window).height() / 2 - $('#modal-box').height() / 2
} );
$('#modal-box').show();
$('#modal-mask').show();
};
});
(不过,请注意作用域的差异。当您仅使用变量openModal
隐式创建变量时,它将在全局作用域中创建,并且对所有代码都可用。当您在另一个函数内声明函数时,它只在该函数内可用。但是,您也可以使用var openModal = function() {
使该变量成为该函数的本地变量。)
将函数定义移到document.ready块之外,事情就会如您所期望的那样工作。在javascript中(和大多数语言一样),在引用函数或变量之前,必须先定义它
在第一个示例中,您在对delay()
的调用中引用了openModal
,但javascript还无法知道openModal
是什么。
openModal = function () {
$('#modal-box').css( {
left: $(window).width() / 2 - $('#modal-box').width() / 2,
top: $(window).height() / 2 - $('#modal-box').height() / 2
} );
$('#modal-box').show();
$('#modal-mask').show();
};
$(document).ready( function() {
delay(openModal, 2000);
});
编辑:
TJHeuvel指出,function
在同一块中执行任何其他操作之前,会做一些技巧来定义函数:为什么我可以在函数之前使用它';在Javascript中定义了什么?
我会说,是的。函数总是必须在调用之前定义。但有些函数可以在定义之前调用(调用)(提升)
我想写的两种不同类型的函数是:
表达式函数&减速功能
1-表达式函数:函数表达式可以存储在变量中,因此它们不需要函数名。它们也将被命名为匿名函数(一个没有名称的函数)。要调用(调用)它们,总是需要使用变量名。如果在定义之前调用,这类功能将不起作用,这意味着这里没有发生吊装。我们总是必须首先定义表达式函数,然后调用它
let lastName = function (family) {
console.log("My last name is " + family);
};
let x = lastName("Lopez");
这就是你在ES6:中的写作方式
lastName = (family) => console.log("My last name is " + family);
x = lastName("Lopez");
2-减速函数:用以下语法声明的函数不会立即执行。它们被"保存以供以后使用",并将在以后调用(调用)时执行。如果在定义它们的位置调用它们的BEFORE或AFTER,这些类型的函数就会起作用。如果你在定义减速功能之前调用它——提升——工作正常。
function Name(name) {
console.log("My cat's name is " + name);
}
Name("Chloe");
吊装示例:
Name("Chloe");
function Name(name) {
console.log("My cat's name is " + name);
}
简而言之,是的,在使用函数之前必须定义它,但您可以使用setTimeout函数来处理延迟,该函数以字符串作为执行代码:
$(document).ready( function() {
setTimeOut('openModal()', 2000);
openModal = function () {
$('#modal-box').css( {
left: $(window).width() / 2 - $('#modal-box').width() / 2,
top: $(window).height() / 2 - $('#modal-box').height() / 2
} );
$('#modal-box').show();
$('#modal-mask').show();
};
});
这将起作用,因为函数在定义之后才会被调用。
- 检查是否定义了数组中的值
- 此比较行为是否定义良好
- 是否定义值的角度ng重复
- 检查是否定义了javascript对象/属性
- 流星:检查是否定义了集合
- Javascript - 检查 Amazon Objects 以查看是否定义
- 查看是否定义了复杂对象变量(objectVar.some.other.value)的简单方法
- 根据页面中是否定义了元素,提供备用外部 Javascript 文件
- 检查是否定义了 CKEDITOR
- Android WebView - 检测是否定义了 JS 函数
- 检查是否定义了对象/函数(JavaScript、Safari问题)
- GWT和JSNI.检查是否定义了函数
- 使用Array.every()函数检查是否定义了所有值
- 查看函数是否定义的更清晰的方法
- 检查对象名称为string的地方是否定义了object
- 确定成员是否定义在(Javascript)超类中
- 检查是否定义了对象的一部分
- 是否有一种方法可以发现javascript 6类是否定义了自己的构造函数?
- 如何检查是否定义了jQuery宽松方法
- 检查是否定义了JSON对象