函数在闭包中看不到变量

时间:2017-03-06 16:15:47

标签: javascript closures

我在这里遇到了错误:"ReferenceError: z is not defined at func

const func = (x) => x + z;
const func2 = (z) => func;
const a = func2(1);
const b = a(2);

我知道我可以这样写:

const func2 = (z) => (x) => x + z;
const a = func2(1);
const b = a(2);

但我使用JSDoc为每个函数添加文档注释,这种方式对我来说更好看:

/**
 * @param {string|number} x
 * @returns {string} 
 */
const func = (x) => x + z;
/**
 * @param {number} z
 * @returns {Function} 
 */
const func2 = (z) => func;
const a = func2(1);
const b = a(2);

而不是:

/**
 * @param {number} z
 * @returns {Function} 
 */
const func2 = (z) => {
  /**
   * @param {string|number} x
   * @returns {string} 
   */
  return (x) => x + z;
};
const a = func2(1);
const b = a(2);

我可能错了,但最好的方法是解决我的问题?

3 个答案:

答案 0 :(得分:2)

您尚未创建闭包。

范围取决于函数定义的位置,而不是调用它的位置。

您的代码相当于:

const func = function (x) { return x + z ).bind(this);
const func2 = function (z) { return func() }.bind(this);

你必须在另一个函数中定义一个函数来创建一个闭包并保持对作用域的访问。

答案 1 :(得分:2)

你可以使用一个真正的闭包,它返回一个范围超过const func2 = z => x => x + z; const a = func2(1); const b = a(2); console.log(a) console.log(b);的函数。

{{1}}

答案 2 :(得分:2)

您收到错误是因为

const func = (x) => x + z;

尝试使用z,但不在其范围内。

仍需要在func内定义

func2,以便它可以访问z。您可以使用详细表单,以便创建const并将文档注释与其关联:

/**
 * @param {number} z
 * @returns {Function} 
 */
const func2 = (z) => {
    /**
     * @param {string|number} x
     * @returns {string} 
     */
    const func = (x) => x + z;
    return func;
};
const a = func2(1);
const b = a(2);

......虽然JSDoc 可能甚至足够聪明,可以用简洁的形式来提取它们:

/**
 * @param {number} z
 * @returns {Function} 
 */
const func2 = (z) =>
    /**
     * @param {string|number} x
     * @returns {string} 
     */
    (x) => x + z
;
const a = func2(1);
const b = a(2);