当我将IIFE分配给变量时,IIFE如何工作?

时间:2017-05-21 05:57:31

标签: javascript iife

我对javascript中的以下代码感到困惑。

var x=(function(){
  var customObject = function(){};

  customObject.prototype.sayHello=function(){
  alert("hello");
  };

  return customObject;
})();

//var y=new x();// If I uncomment this line and comment the next line "var 
//y=x;" the code works 
var y=x;
y.sayHello();

这段代码没有问好,但是当我删除评论时它会这样做。我读到IIFE在定义后立即执行。因此,它应该直接将customObject分配给x。

我的问题是为什么我需要创建一个x的新实例来打招呼。我不清楚IIFE是如何在这里工作的。

请帮助我理解这个概念。先感谢您 :-) 。

2 个答案:

答案 0 :(得分:3)

您将x分配给customObject是正确的。但是x(因此sayHello)没有prototype属性。它具有sayHello属性,而 具有y=x属性。

当您执行y.sayHello()然后customObject.sayHello时,您正在尝试拨打不存在的y=new x()

执行customObject.prototype时,创建一个原型为y.sayHello()对象的对象。然后,当您致电sayHello时,会通过原型链找到var x = function() {} x.prototype.sayHello = function() { alert("hello"); } 函数。

这与您使用IIFE无关。如果您刚写完:

,您会得到相同的结果
{{1}}

而不是IIFE。

答案 1 :(得分:1)

好的,我在这里感到困惑。

首先,IIFE正在这里正确地开展工作。它执行并将customObject返回到变量x

这就是应该做的。

现在回答你的实际问题, 为什么我需要创建一个新的x实例来表示你好

您可能已阅读,所有classes(functions)都有prototype,所有variables都有__proto__属性。

原型上设置的任何内容都可以被该构造函数的实例访问。

例如:

var myName = "apl"; // a simple string

console.log(myName.toUpperCase()) // outputs: APL

您认为我们如何在变量名称上调用toUpperCase()

我们可以,因为typeof(myName )原来是string。因此,myName可以调用String.prototype上设置的任何属性/方法。

简而言之,__proto__上的myName属性应设置为字符串的prototype

myName.__proto__ === String.prototype // true,因为myName是String

的实例

因此,在您的情况下,您需要y作为x的实例。只有这样,您才能访问x原型上设置的方法,而customObject.prototype原型又import tensorflow as tf import numpy as np I = [1, 0, 2, 3, 0, 1, 1] K = [2, 1, 3] i = tf.constant(I, dtype=tf.float32, name='i') k = tf.constant(K, dtype=tf.float32, name='k') data = tf.reshape(i, [1, int(i.shape[0]), 1], name='data') kernel = tf.reshape(k, [int(k.shape[0]), 1, 1], name='kernel') res = tf.squeeze(tf.nn.conv1d(data, kernel, 1, 'VALID')) with tf.Session() as sess: print sess.run(res) print np.convolve(I, K[::-1], 'VALID')