为什么立即调用的方法返回window对象this,
var o = {};
o.foo = function () {
console.log(this);
}(); //Window {…}
Run Code Online (Sandbox Code Playgroud)
但是当稍后执行时,该方法返回对象o(正如我在两种情况下都预期的那样)?
var o = {};
o.foo = function () {
console.log(this);
}
o.foo(); //Object {foo: function}
Run Code Online (Sandbox Code Playgroud) 我正在阅读这个问题.我有点理解发生了什么,但我很困惑
!function foo() {
console.log(true) ;
}()
Run Code Online (Sandbox Code Playgroud)
不回来false.
!function () {}()这也将返回与函数返回值相反的布尔值,在本例中为true,因为!undefined为true.如果您希望实际返回值是调用的结果,那么尝试这样做:
"也将返回布尔对面"让我觉得false应该返回.为什么不呢.alert(!true); //false
We can have immediately invoking function in two ways. I am confused about what is the difference between the following
var foo = function(){
return { };
}();
Run Code Online (Sandbox Code Playgroud)
and this :
var foo = (function(){
return { };
}());
Run Code Online (Sandbox Code Playgroud) 让我先说一下,我知道它不是以编程方式从外部访问IIFE的内部变量,除非它们已被全局范围访问.
例如:
(function() {
var a = "Hello"; // a isn't accessible from the outer scope
)();
console.log(a); // a is undefined
Run Code Online (Sandbox Code Playgroud)
但:
(function() {
var a = "Hello";
global.a = a;
)();
console.log(a); // Displays "Hello"
Run Code Online (Sandbox Code Playgroud)
在某些情况下,IIFE可能会持续执行几秒钟,或者在整个页面浏览期间,通常是在用JavaScript编写的游戏中,IIFE将包含游戏循环.
因此,IIFE中声明的所有变量和函数必须存在于浏览器内存中,但由于封装,它们无法从开发人员控制台显示.
我的问题是:有没有什么方法可以显示或操作它们,而不是先前修改代码,而它正在运行?由于这些变量存在于内存中并被使用?也许是通过某种调试?
我的问题主要针对Firefox和Chrome(Firebug和开发人员工具),但如果有一般方法可以使用它.
我正在学习JavaScript.我已经尝试了下面的代码,我发现一个对象的值是未定义的.我希望最后一个控制台语句打印对象v中的所有值.我的期望是这个语句v.sampleFunction()将返回"给定的字符串是样本字符串样本字符串".而且我认为我可以使用v.values打印相同的内容.请告诉我我在做错的地方.
var r;
var v = new Object();
(function() {
// function 1
function s(sampelString) {
var t = "The given String is "+sampelString;
return (t);
}
r = s("Sample Text");
// Adding SampleFunction to v
v.samepleFuntion = function() {
s("Sample String Sample String");
}
})();
v.samepleFuntion();
console.log("The values in r==="+r);
console.log("The values in v==="+v.values);Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么会这样吗?
如果我在一个名为的文件中写这样的东西test.js,
const anyObject = {}
(function(){
console.log('hello world!')
}())
Run Code Online (Sandbox Code Playgroud)
通过控制台运行它 $node test.js
然后在控制台中,hello world!将打印一个,但接下来是:
TypeError: (intermediate value) is not a function
我不知道究竟发生了什么,我想某种节点是将函数表达式作为函数调用表达式?
我正在使用节点 v6.9.1
免责声明:我已经被警告过,这个问题可能会被低估.如果你没有,我会很感激 - 我在Javascript课程中询问了我的老师的解释,他不知道所以我想我会在这里问...
我正试图绕过头this,一直在读Kyle Simpson,但遇到了一个我不明白的案例.
据我所知,当你在另一个函数中调用一个函数时,如果该函数被称为"独立"(参见Simpson这里:你不知道JS:这个和对象原型)那么this应该是Window(或者undefined如果它处于strict模式中)
var fn = function globo () { console.log(this);};
function calling(called) {
console.log(called());
}
calling(fn); // "Window" or "undefined"
Run Code Online (Sandbox Code Playgroud)
但如果你将类似的功能传递给IIFE,你会得到一个好奇的结果
function calling(called) {
console.log(called());
}(function globo () { console.log(this);}); // [Function: globo]
Run Code Online (Sandbox Code Playgroud)
这似乎是一种罕见的情况,它this引用了被调用的函数,而不是"调用者"或它定义的默认情况.
知道这里发生了什么吗?
当我们使用独立的函数语句作为IIFE时,我们需要对其进行包装()以使其起作用
// IFFE
(function a(){
console.log('Hello')
}());
// IFFE
(function a(){
console.log('Hello')
})()Run Code Online (Sandbox Code Playgroud)
如果我们不包装()代码,则会产生语法错误
function a(){
console.log('Hello')
}()Run Code Online (Sandbox Code Playgroud)
但是,当我们将其用作函数表达式时,不需要用 ()
let a = function a(){
console.log('Hello')
}()Run Code Online (Sandbox Code Playgroud)
那么,为什么()要在将其用作函数语句时需要包装它呢?
let groupedWishlistProducts;
(async function () {
groupedWishlistProducts = await fetchGroupedWishlistProducts();
console.log(groupedWishlistProducts); // logs returned value properly
})();
console.log(groupedWishlistProducts); // logs undefined
Run Code Online (Sandbox Code Playgroud)
为什么groupedWishlistProducts在全局范围内未定义,即使我已经在全局范围内初始化?
let f = function(x) {
alert(x)
}
(function() {
f(1)
}())Run Code Online (Sandbox Code Playgroud)
为什么这段代码会抛出错误?起初,我认为问题与 IIFE 的语法不正确有关,但后来我了解到这种语法也很合适