请问这里bem代表的是哪个函数?
来源:5-26 基础组件-Swipe 轮播图组件开发-02
秋得法
2023-11-02
const [name, bem] = createNamespace(‘swipe’)
这里bem是代表的 createBEM(prefixedName)函数,还是 createBEM(prefixedName)函数返回的函数呢?
我理解的是 createBEM(prefixedName)这个函数,如果是这个函数那么bem(‘big’)是不是就是 createBEM(‘big’)这样就不对了,前缀就会变成op-big
但如果bem是代表 createBEM(prefixedName)返回的那个函数,那么前缀op-swipe又是怎么传递进去子元素的,因为bem仅仅调用了内部的函数,name又是怎么传递进去的?为什么呢?困惑中求解!
2回答
-
one_pieces
2023-11-02
同学你好,这个问题没有这么复杂,首先 const [name, bem] =createNamespace(‘swipe’) 返回的是一个数组,我们看看 createNamespace 的代码,就能知道数组的第二个元素,也就是 bem 实际就是一个函数,它可以根据 bem 的规则来生成对应的 css 类名。当然这里也是涉及到闭包的概念,但不用过多纠结,你可以把它理解成一个临时内存,用来存放临时变量即可~
00 -
秋得法
提问者
2023-11-02
当一个函数在 JavaScript 中被创建时,它会捕获其外部作用域的变量和参数。这就是所谓的闭包。闭包使得函数能够记住创建它的上下文,并在以后的调用中继续访问那些上下文中的变量。
在您的代码中,`createBEM` 函数返回了一个内部函数,这个内部函数是 `littlename`。内部函数 `littlename` 记住了 `createBEM` 函数中的参数 `prefixedName`。这是因为 `littlename` 在 `createBEM` 函数内部创建,它继续保持对 `prefixedName` 的引用。
当您调用 `createBEM(prefixedName)` 时,它返回一个新的 `littlename` 函数,并将 `prefixedName` 绑定到该函数的上下文中。这意味着 `littlename` 函数 "知道"应该使用 `prefixedName` 的值来生成类名。
以下是一个更具体的示例,用于说明闭包的工作方式:
```javascript function createCounter(initialValue) { let count = initialValue; return function () { return count++; // 闭包,记住了 count 的值 }; } const counterA = createCounter(1); const counterB = createCounter(10); console.log(counterA()); // 输出 1 console.log(counterA()); // 输出 2 console.log(counterB()); // 输出 10 console.log(counterB()); // 输出 11 ```在这个示例中,`createCounter` 函数返回一个内部函数,该内部函数记住了 `count` 的值,因此每次调用 `counterA` 和 `counterB` 时,它们都能保持各自的计数状态,而不会相互干扰。这是闭包的工作方式,内部函数保持对外部作用域的引用,以便在以后的调用中访问外部作用域中的变量。
00
相似问题