vue3 setup中函数表达式和函数声明

vue3 setup中函数表达式和函数声明

随着 Vue 3Composition API 的引入,现在可以通过函数表达式和函数声明这两种方式声明函数。

函数声明

函数声明是在非函数式编程语言中声明函数的传统或正常方式。以function关键字开头,后跟函数名称、一对括号,最后是一对括住函数体的花括号。

这是一个例子:

js 复制代码
function greet(name) {
  console.log(`Hello, ${name}!`);
}

函数声明的一个重要特征是它们被提升到其作用域的顶部。这意味着无论函数声明写在代码中的什么位置,都可以在同一范围内的任何位置调用。

例如:

js 复制代码
greet("stranger"); // "Hello, stranger!"

function greet(name) {
  console.log(`Hello, ${name}!`);
}

即使在定义greet()函数之前调用该函数,也不会报错,因为函数声明也会被提升到作用域的顶部。

函数表达式

另一方面,函数表达式是产生函数的表达式。它也是使用function关键字,将其分配给变量或对象的属性。

这是一个例子:

js 复制代码
const greet = function() {
  console.log("Hello!");
};

或使用箭头函数:

js 复制代码
const greet = () => {
  console.log("Hello!");
};

两者之间的一个关键区别是函数表达式不会被提升。它们只能在定义后才能被调用。

js 复制代码
greet("stranger"); /* "ReferenceError: Cannot access 'greet' before initialization  */

const greet = function(name) {
  console.log(`Hello, ${name}!`);
}

函数表达式也比函数声明更灵活,因为它们可以在更多上下文中使用,例如作为参数传递给其他函数或用作对象的方法。

html 复制代码
<button id="myButton">点击</button>

<script>
  const myButton = document.querySelector('#myButton');
  
  myButton.addEventListener('click', function() {
    console.log('Button clicked!');
  });
</script>

不久前,函数表达式还被认为是优越的,因为它们不会污染全局范围。但如今 ES 模块被广泛采用,这个优势已经没了。

事实上,这两种方式差别不大,现在,选择哪一个实际上取决于个人喜好。我个人更喜欢喜欢使用函数声明。让我们使用这两种方法来查看 Vue 组件来解释为什么更倾向于函数声明。

在vue中使用这两种方式

函数声明

html 复制代码
<script setup>
import { debounce } from "debounce";
import { ref, watch } from "vue";

const searchTerm = ref("");
const products = ref([]);

watch(searchTerm, debounce(performSearch, 600));

async function performSearch() {
  if (searchTerm.value === "") {
    products.value = [];
        return;
  }
  if (searchTerm.value.length < 2) {
    return;
  }
  const searchUrl = getSearchUrl();
  const response = await (await fetch(searchUrl)).json();
  products.value = response.products;
}

function getSearchUrl() {
  const url = "https://dummyjson.com/products/search";
    const params = {
    q: searchTerm.value,
        limit: "5"
  };
  const searchParams = new URLSearchParams(params);
  return `${url}?${searchParams}`;
};

function clearSearch() {
  searchTerm.value = "";
  products.value = [];
}

</script>

函数表达式

html 复制代码
<script setup>
import { debounce } from "debounce";
import { ref, watch } from "vue";

const searchTerm = ref("");
const products = ref([]);

const performSearch = async () => {
  if (searchTerm.value === "") {
    products.value = [];
        return;
  }
  if (searchTerm.value.length < 2) {
    return;
  }

  const searchUrl = getSearchUrl();
  const response = await (await fetch(searchUrl)).json();

  products.value = response.products;
}

watch(searchTerm, debounce(performSearch, 600));

const getSearchUrl = () => {
  const url = "https://dummyjson.com/products/search";
    const params = {
    q: searchTerm.value,
        limit: "5"
  };

  const searchParams = new URLSearchParams(params);
  return `${url}?${searchParams}`;
};

const clearSearch = () => {
  searchTerm.value = "";
  products.value = [];
}

</script>

我们都知道,在vue3中的script setup声明的所有内容都会自动在模板中可用。使用函数声明时,能够从数据或计算变量中更容易识别方法,因为它们都以关键字function开头。区别很微妙,但毕竟最好的代码是其他人可以轻松理解的。

相关推荐
蟾宫曲3 小时前
在 Vue3 项目中实现计时器组件的使用(Vite+Vue3+Node+npm+Element-plus,附测试代码)
前端·npm·vue3·vite·element-plus·计时器
秋雨凉人心3 小时前
简单发布一个npm包
前端·javascript·webpack·npm·node.js
liuxin334455663 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
qq13267029403 小时前
运行Zr.Admin项目(前端)
前端·vue2·zradmin前端·zradmin vue·运行zradmin·vue2版本zradmin
LCG元4 小时前
Vue.js组件开发-使用vue-pdf显示PDF
vue.js
魏时烟4 小时前
css文字折行以及双端对齐实现方式
前端·css
哥谭居民00015 小时前
将一个组件的propName属性与父组件中的variable变量进行双向绑定的vue3(组件传值)
javascript·vue.js·typescript·npm·node.js·css3
烟波人长安吖~5 小时前
【目标跟踪+人流计数+人流热图(Web界面)】基于YOLOV11+Vue+SpringBoot+Flask+MySQL
vue.js·pytorch·spring boot·深度学习·yolo·目标跟踪
踢足球的,程序猿5 小时前
Android native+html5的混合开发
javascript
2401_882726485 小时前
低代码配置式组态软件-BY组态
前端·物联网·低代码·前端框架·编辑器·web