2016-04-04 4 views
0

меня попросили в какой-то уступки, чтобы сделать следующее:Vanilla JS | Invokable объект, который также содержит свойство

fun4(): возвращает объект, который может быть вызван в качестве функции. этот объект также должен иметь свойство «k» с нулевым значением (поэтому fun4()() должен что-то делать)

Первая часть вопроса проста и понятна. Второй вопрос для меня. Как создать объект в JS, который может быть вызван и доступ к статически.

Для упрощения: Можно создать объект, который ведет себя следующим образом:

> let o = CustomObject; 
> o.k 
< null 
> o() 
< //Some value returned here from the function 

Спасибо!

ответ

1

Это выглядит очень просто для меня ...

let CustomObject = function(){ return "hello"; } 
CustomObject.k = null; 

Это передаст ваши критерии приемки

+0

Это сработало, и я написал что-то подобное раньше. Вопрос: почему я не могу увидеть это свойство (но я могу получить к нему доступ), если я запишу его (через Chrome)? @ olivarra1 – Aviad

+1

Потому что Chrome рассматривает его как функцию и дает вам представление «функция». Попробуйте сделать 'console.log («% O », CustomObject)', это даст вам представление «объект». Этот код также очень полезен для проверки элементов DOM ('console.log ("% O ", element)') – olivarra1

+0

Спасибо! узнал что-то новое :) – Aviad

1

Что касается ванили JS, это то, что вы ищете:

var fun4 = function() { 
    let val = function() { console.log("hello"); }; 
    val.k = null; 

    return val; 
} 


fun4() // returns the function 
fun4()() // logs 'hello' 
fun4().k // returns null 

Учитывая одно из ваших комментариев выше, нужно только одно - следить за использованием вами let и var. В этом случае var можно было бы использовать без какой-либо разницы (когда val выпадает из области действия, когда функция возвращается, переменная будет выпущена для сбора мусора). Однако, когда вы запускаете это в консоли (а когда не находитесь внутри функции или другой четко определенной и изолированной области), переменные, созданные с использованием let, будут уничтожены после каждого вызова - другими словами, всякий раз, когда вы нажимаете return. Способ продемонстрировать это, чтобы сравнить их:

var test = function() { 
    let x = 1; 
    let x = 1; // this will cause an immediate syntax error when the script is parsed; 
} 

С другой стороны:

> let x = 1; 
< undefined 
> let x = 1; // In the console, this will not raise any error/exception 
      // because the scope is cleared after the line above has 
      // executed and returned 
< undefined 
+0

Спасибо за разъяснение :) – Aviad

0

Вы можете увидеть свойство «к», как показано ниже.

enter image description here

Смежные вопросы