下面的代码来自 Brad Traversy 在 MERN 堆栈上的 Udemy 课程。我是 Redux 和 Redux Thunk 的新手,我正在尝试了解其目的=> dispatch =>
是什么。我知道它来自 Redux Thunk,它是在 Redux 存储文件中设置的。我认为dispatch
这里使用 是为了从此函数中分派多个操作,并阅读该= ([arg(s)]) => dispatch =>
语法是柯里化的一个示例(尽管这似乎并不正确,因为柯里化每个函数都有一个参数)。
我非常感谢任何帮助理解=> dispatch =>
。
(其他令人困惑的小点:在课程中,该函数setAlert
被称为动作,但我不确定这是正确的,因为它包含多个动作分派。)
export const setAlert = (msg, alertType, timeout = 5000) => dispatch => {
const id = uuidv4();
dispatch({
type: SET_ALERT,
payload: { msg, alertType, id }
});
setTimeout(() => dispatch({ type: REMOVE_ALERT, payload: id }), timeout);
};
Run Code Online (Sandbox Code Playgroud) 据我所知,JavaScript 是基于原型而不是类的 OOP 不考虑接口,而是依赖于鸭子类型。
然而,我经常可以在 MDN 在线文档中看到一些被描述为“接口”的对象,例如此处的存储:
https://developer.mozilla.org/en-US/docs/Web/API/Storage
实际上 window.Storage 存在并且是一个函数,但不是构造函数或工厂,并且在调用时失败。它没有像该页面中描述的那样的成员,而是 window.localStorage 。这一页
https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
将 window.Storage 指向为 window.localStorage 访问的对象。我知道 window.localStorage 是一个本机对象,但我想了解 window.Storage 的作用以及为什么 MDN 将其称为“接口”,在什么意义上:它是浏览器开发人员遵守的规范,而不是基于类的范式中预期的严格“接口”?
在此先感谢您,对于奇怪的问题感到抱歉。只是想加深我对 ES 的理解。
这两个闭包示例都具有在后续函数调用中保留count值的好处,而其他情况(如果未使用闭包),则每次函数调用后count都将重置为0。此外,在这两种情况下,计数变量(作为块中的任何let变量)都是私有的,即不可全局访问。
IFFE闭包示例改编自Marius Schulz的文章,他在其中提出了这种用法。我可以想到的是,使用IFFE版本的闭包而不是普通版本的唯一好处是,不必命名它(只需将其分配给变量即可再次调用它),或者您确实要为其命名,它将在全局范围内不可见-因此,有少一个污染全局名称空间的项目。我还有其他好处吗?
定期关闭:
function createCounter() {
let count = 0;
return function() {
++count;
return `count equals ${count}`;
};
};
let counter = createCounter();
console.log(counter()); // count equals 1
console.log(counter()); // count equals 2
Run Code Online (Sandbox Code Playgroud)
IFFE关闭:
let countingFunction = (function() {
let count = 0;
return function() {
++count;
return `count equals ${count}`;
};
})();
console.log(countingFunction()); // count equals 1
console.log(countingFunction()); // count equals 2
Run Code Online (Sandbox Code Playgroud)
编辑:标记为重复的问题是一个不同的问题,并且所选答案不能回答该问题。
我使用 Bootstrap 创建了一个基本页面,无法使块引用的字体变小。当我更改 CSS font-size 属性时,边距会发生变化,因为它们基于该属性,但文本本身的大小不会发生变化。
这是应用于块引用的 CSS:
blockquote {
font-family: Georgia, serif;
font-size: 1em;
font-style: italic;
margin: 3em auto !important;
padding: 0.35em 40px;
line-height: 1.45;
position: relative;
color: #383838;
}
blockquote:before {
display: block;
padding-left: 10px;
content: "\201C";
font-size: 80px;
/* Element with abolute positioning is positioned relative to nearest positioned ancestor */
position: absolute;
/* Offsets from edges of element's containing block, ancestor to which element is relatively positioned */
left: -20px; /* Negative moves it left …
Run Code Online (Sandbox Code Playgroud) 在涵盖相对提交引用的 Udacity 课程中,它说:
^ 表示父提交,~ 表示第一个父提交
^ 和 ~ 之间的主要区别在于何时从合并创建提交。合并提交有两个父项。对于合并提交,^ 引用用于指示提交的第一个父项,而 ^2 指示第二个父项。第一个父级是您运行 git merge 时所在的分支,而第二个父级是合并到的分支。
基于在git log --oneline --graph
命令行上运行的以下输出:
使用 SHA 的提交f69811c
是 HEAD~4^2 相对于(最顶层,带有头指针)提交9ec05ca
。合并提交1a56a81
的第二个父项是f69811c
,课程解释了这一点“HEAD~4 引用了当前提交的第四个父项提交,然后 ^2 告诉我们它是合并提交的第二个父项(被合并到)”
根据以黄色引用的课程文本,它似乎e014d91
是1a56a81
的第一个父级,因为它是与合并提交具有相同分支的父级。
根据这些信息,e6c65a6
的关系1a56a81
是什么?
我不认为它也是第二个父母(如果可以有多个第一和第二个父母......),即使它也是合并到 master 的分支,因为该答案在课程测验中被拒绝。
另外,如果我是正确的,e014d91
是1a56a81
第一个母公司,是什么的关系2097521
,并3772ab1
以1a56a81
(这似乎他们也第一次家长,再次,如果合并提交其实可以有多个父)?
术语“初始化”和“赋值”似乎可以互换使用。我做了一些搜索,似乎技术上可能存在差异。我的理解是,在变量的上下文中,当 JavaScript 引擎使其可供使用时,变量就会被初始化,而赋值(无论是显式完成 [如let foo = 1;
] 还是由 JavaScript 引擎完成,如下例所示)是一种方法为了达成这个。
let foo;
console.log(foo); // undefined (initialization and assignment?)
Run Code Online (Sandbox Code Playgroud)
我的理解正确吗?另外(如果是这样),在初始化过程中实际发生了什么以使变量可用?
在 Udacity 课程中,它提到了关于模块模式的相互矛盾的事情:
模块模式需要使用 IIFE
和
模块模式的核心是利用范围、闭包和(通常)IIFE。
那么,如果我理解正确的话,模块模式需要使用闭包,但是闭包是否需要位于 IIFE 中?
许多 MDN 页面将事物描述为“界面”——我很惊讶“界面”没有链接到更解释性的页面;它只是在 MDN 的Web API 页面上描述为“对象类型” 。
我正在使用的 Perl 文件包含许多s~
. 我对 Perl 不熟悉,并且很难找到有关它的信息。我知道它与搜索和替换字符串有关。具体是s~
做什么的?
例子:
s~ (Text)~ <a href="../images/text.pdf" target="_top">$1</a>~ig if /<p/;
Run Code Online (Sandbox Code Playgroud) 在解释如何使用户定义的可迭代的教程中,它说
那么我们如何在自己的对象上实现可迭代协议呢?我们通过定义一个带有 Symbol.iterator 键的方法来实现这一点。
[Symbol.iterator]
鉴于它是方法的一部分,将其称为键是否正确?我的理解是键只能是属性的一部分(属性由键和值组成),而方法是对象内部使用的函数。
作为参考,这是教程中的示例:
class UserCollection {
constructor(users) {
this.users = [].concat(users);
}
[Symbol.iterator]() {
let i = 0;
let users = this.users;
return {
next() {
if (i < users.length) {
return { done: false, value: users[i++] };
}
return { done: true };
}
};
}
}
Run Code Online (Sandbox Code Playgroud) 在 w3schools关于 switch 语句的教程中,它说:
如果 default 不是 switch 块中的最后一个 case,请记住以 break 结束 default case。
但是,正如该教程还指出:
当 JavaScript 遇到 break 关键字时,它会跳出 switch 块。
因此,如果在 switch 语句的开头有一个带 break 的默认值,为什么不总是执行默认值并且解释器立即退出该块?解释器没有按顺序读取 switch 语句中的项目?
在我的render方法中,如果我首先检查用于获取报价的getter方法(基于随机索引),则只能成功地从JSON报价的提取列表中渲染随机报价。这可以正常工作:{this.randomQuote ? this.randomQuote.quote : ''}
,但是如果我只是这样做{this.randomQuote.quote}
,则会收到“ TypeError:无法读取未定义的属性'quote'”。(请注意,quote是获取的JSON对象数组中每个对象的属性的名称。因此randomQuote方法根据randomQuoteIndex()方法选择的随机索引从JSON中选择一个对象,但仅选择quote属性仅仅检查一下是否this.randomQuote
不是未定义的,那怎么可能让我调用render this.randomQuote.quote
?
这是该类的工作版本:
class App extends Component {
constructor(props) {
super(props);
this.state = {
quotes: [],
randomQuoteIndex: null
}
}
componentDidMount() {
// fetch method uses GET method by default; don't need to specify
fetch('https://gist.githubusercontent.com/nataliecardot/0ca0878d2f0c4210e2ed87a5f6947ec7/raw/1802a693d02ea086817e46a42413c0df4c077e3b/quotes.json')
// Takes a JSON response string and parses it into JS object
.then(response => response.json())
// state is set to quotes: quotes due to destructuring
.then(quotes => this.setState({ quotes }, () => { …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将id
带有 useState的道具应用于我的 DrumPad 组件,从其父 App 组件传入。在我的 app.js 文件中,正如它当前设置的那样,我收到一个错误“'id' 被分配了一个值但从未使用过。” 假设我需要使用 useState 设置变量以将 id 传递给 DrumPad 组件,我需要更改什么才能正确应用它?
应用程序.js:
const sounds = [
{ id: 'snare', letter: 'Q', src: 'https://www.myinstants.com/media/sounds/snare.mp3' },
{ id: 'bass 1', letter: 'W', src: 'https://www.myinstants.com/media/sounds/bass-drum.mp3' },
// etc.
];
const App = () => {
const id = useState(''); // (Don't have setId since it won't change)
return (
<div className="App">
{sounds.map(sound => (
<DrumPad
id={sounds.id}
/>
))}
</div>
);
}
Run Code Online (Sandbox Code Playgroud)
DrumPad.js:
const DrumPad = () …
Run Code Online (Sandbox Code Playgroud) javascript ×9
reactjs ×3
closures ×1
css ×1
git ×1
git-log ×1
iife ×1
interface ×1
merge ×1
perl ×1
react-hooks ×1
redux ×1
redux-thunk ×1